home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir42 / genscr18.zip / GENSCRNX.PRG < prev    next >
Text File  |  1994-01-26  |  172KB  |  6,131 lines

  1. ***************************************************************************
  2. *
  3. * Procedure file: GENSCRNX.PRG
  4. *         System: GenScrnX
  5. *        Version: 1.8
  6. *         Author: Ken R. Levy
  7. *        Company: Jet Propulsion Laboratory
  8. *      Copyright: None (Public Domain)
  9. *
  10. ***************************************************************************
  11. *
  12. * GENSCRNX - Screen Database Generator.
  13. *
  14. * Description:
  15. * This program generates database from objects designed and built with
  16. * FoxPro screen builder.
  17. *
  18. * Notes:
  19. * In this program, for clarity/readability reasons, variable names
  20. * are used that are longer than 10 characters.  Note, however, that only
  21. * the first 10 characters are significant.
  22. *
  23. FUNCTION genscrnx
  24. PARAMETERS projdbf,recno,dummy
  25. PRIVATE gstatus,gsx_mode,fconfigfp,cr,lf,cr_lf,null
  26. PRIVATE genscrn,genscrnx,warnings,gsxversion,mvcount
  27. PRIVATE transport,transportx,ftrndrv1,ftrndrv2,drvoffs
  28. PRIVATE pathfox,fgenscx,fupdspr,ffoxscx,ffoxscx2,projpath
  29. PRIVATE fpjxbase,fscxbase,fscxdata,fsprout,fspxout,fsprout2
  30. PRIVATE spxout2,fsprerr,compspr,dispspr,autorun,drv_no,drv_cnt
  31. PRIVATE platonly,autohalt,outtxt,lastpoint,lastselect,updsprflag
  32. PRIVATE inclibs,baslibs,fromproj,fcountadj,fnctnames,scnobj
  33. PRIVATE lastonerror,lastsetcomp,lastsetexac,lastsetpath,lastsettr
  34. PRIVATE lastsetcry,lastsetnear,lastsetdec,lastsetsfty,lastsetdel
  35. PRIVATE lastsetexcl,lastsetudfp,lastsetcur,lastmemow
  36. PRIVATE c_defobj,c_basobj,c_insobj,c_insscx,c_inclib,c_deflib
  37. PRIVATE c_baslib,c_trntxt,c_memvar,c_instxt,c_delete,c_delobj
  38. PRIVATE c_if,c_size,c_nosize,c_svsize,c_svpict,c_basbefore
  39. PRIVATE c_defobj,c_group,c_default,c_picture,c_refresh,c_name,p_name,s_para
  40. PRIVATE c_pjx_set,c_set,c_insert,p_insert,c_prg,c_outfile
  41. PRIVATE c_endtxt,c_function,c_endfnct,c_method,c_endmthd
  42. PRIVATE c_genscrnx,c_nogen,c_noxgen,c_section3,c_nowclaus
  43. PRIVATE c_compspr,c_nocompspr,c_dispspr,c_nodispspr,c_drvoff,c_click
  44. PRIVATE c_autorun,c_noautorun,c_scnobj,c_noscnobj
  45. PRIVATE c_braces,c_nobraces,c_ignrbrcs,c_evltxt
  46. PRIVATE m_deflib,m_defobj,m_basobj,m_instxt,m_delete
  47. PRIVATE m_if,m_size,m_nosize,m_svsize,m_svpict,m_basbefore
  48. PRIVATE m_default,m_picture,m_section3,m_method,find_str
  49. PRIVATE scx_name,memline,i,j,k,newsetpath,pjxset,eval_cmnt
  50. PRIVATE r_projbase,r_scxdata,platform_,cplatform_,splatform_
  51. PRIVATE lib_mode,gen_mode,xgen_mode,braces,ignrbraces,doprogram
  52. PRIVATE scxcount,cscxcount,allplatforms,screens
  53. PRIVATE msg1,msg2,msg3,nextfile,memtemp1,memtemp2,memtemp3
  54. PRIVATE c_dlgface,c_dlgsize,c_dlgstyle,badchars,stdascii
  55. DIMENSION a_fscxdrv(1,8),a_scxdrv(1,8),a_scxdrvs(8),a_scxdrvm(8),;
  56.           a_c_scxdrv(8),a_fsprdrv(1,6),a_sprdrv(1,6),a_sprdrvs(6),;
  57.           a_sprdrvm(8),a_c_sprdrv(6),a_drvoff(1)
  58.  
  59. m.gsxversion='1.8'
  60. m.doprogram=IIF(PARAMETERS()=1.AND.TYPE('m.projdbf')=='C',m.projdbf,'')
  61. m.lastsettr=SET('TRBETWEEN')
  62. SET TRBETWEEN OFF
  63. _FOX25=(SUBSTR(VERSION(),AT('2.',VERSION()),3)>='2.5')
  64. _FOX25REV=IIF(_FOX25,SUBSTR(VERSION(),AT('2.',VERSION())+3,1),'')
  65. IF .NOT._FOX25
  66.   _DOS=.T.
  67.   _WINDOWS=.F.
  68.   _MAC=.F.
  69.   _UNIX=.F.
  70. ENDIF
  71. DO CASE
  72.   CASE _WINDOWS
  73.     m.cplatform_='WINDOWS'
  74.   CASE _MAC
  75.     m.cplatform_='MAC'
  76.   CASE _UNIX
  77.     m.cplatform_='UNIX'
  78.   OTHERWISE
  79.     m.cplatform_='DOS'
  80. ENDCASE
  81. m.cplatform_=PADR(m.cplatform_,8)
  82. IF TYPE('m.recno')#'N'
  83.   m.recno=0
  84. ENDIF
  85. m.gsx_mode=m.recno>=2.AND.ATC('.PJX',m.projdbf)>0
  86. m.gstatus=0
  87. m.warnings=0
  88. m.pathfox=SYS(2004)
  89. m.cr=CHR(13)
  90. m.lf=CHR(10)
  91. m.cr_lf=m.cr+m.lf
  92. m.null=CHR(0)
  93. DIMENSION a_file_ext(4)
  94. a_file_ext(1)='.EXE'
  95. a_file_ext(2)='.APP'
  96. a_file_ext(3)='.PRG'
  97. a_file_ext(4)='.FXP'
  98. m.lastselect=SELECT()
  99. m.lastsetpath=SET('PATH')
  100. m.lastpoint=SET('POINT')
  101. SET POINT TO '.'
  102. m.fconfigfp=SYS(2019)
  103. IF FILE(m.fconfigfp)
  104.   CREATE CURSOR CONFIGFP (FP M)
  105.   IF _WINDOWS.OR._MAC
  106.     SET MESSAGE TO ' '
  107.   ENDIF
  108.   INSERT BLANK
  109.   APPEND MEMO FP FROM (m.fconfigfp) OVERWRITE
  110.   REPLACE FP WITH evltxt(FP)
  111. ELSE
  112.   m.fconfigfp=''
  113. ENDIF
  114. m.mvcount=configfp('MVCOUNT','256')
  115. IF VAL(m.mvcount)<512
  116.   =warning("'MVCOUNT="+m.mvcount+"' should be set to at least 512 in "+;
  117.            SYS(2019))
  118. ENDIF
  119. m.genscrnx=IIF(TYPE('_GENSCRNX')=='C',UPPER(_GENSCRNX),configfp('GENSCRNX','ON'))
  120. m.genscrn=add_fext(configfp('_GENSCRNX',m.pathfox+'GENSCRN.PRG'))
  121. m.ffoxscx=IIF(TYPE('_FOXSCX')=='C',UPPER(_FOXSCX),configfp('_FOXSCX',;
  122.           m.pathfox+'FOXSCX.DBF'))
  123. IF .NOT.EMPTY(m.ffoxscx).AND..NOT.'.'$m.ffoxscx
  124.   m.ffoxscx=m.ffoxscx+'.DBF'
  125. ENDIF
  126. IF EMPTY(m.doprogram).AND.TYPE('m.projdbf')#'C'
  127.   m.i=openfoxscx()
  128.   IF USED('CONFIGFP')
  129.     USE IN CONFIGFP
  130.   ENDIF
  131.   IF .NOT.m.i
  132.     RETURN .F.
  133.   ENDIF
  134.   m.memline="PLATFORM=='"+m.cplatform_+"'"
  135.   SET FILTER TO &memline
  136.   RETURN .T.
  137. ENDIF
  138. IF .NOT.m.gsx_mode.AND.EMPTY(m.doprogram)
  139.   m.transport=add_fext(configfp('_TRANSPRTX',m.pathfox+'TRANSPRT.PRG'))
  140.   m.ftrndrv1=add_fext(configfp('_trndrv1',''))
  141.   m.ftrndrv2=add_fext(configfp('_trndrv2',''))
  142.   IF USED('CONFIGFP')
  143.     USE IN CONFIGFP
  144.   ENDIF
  145.   IF FILE(m.ftrndrv1)
  146.     DO (m.ftrndrv1) WITH m.projdbf,m.recno,m.dummy
  147.     IF m.gstatus=-2
  148.       RETURN 0
  149.     ENDIF
  150.     IF m.gstatus=-1
  151.       RETURN -1
  152.     ENDIF
  153.   ENDIF
  154.   IF .NOT.FILE(m.transport)
  155.     RETURN -1
  156.   ENDIF
  157.   m.transport=trimext(m.transport)
  158.   RELEASE ALL LIKE ?_*
  159.   SET PATH TO (m.pathfox)
  160.   macrofnct='m.gstatus='+trimpath(m.transport)+'(m.projdbf,m.recno,m.dummy)'
  161.   ¯ofnct
  162.   IF EMPTY(m.lastsetpath)
  163.     SET PATH TO
  164.   ELSE
  165.     SET PATH TO (m.lastsetpath)
  166.   ENDIF
  167.   IF FILE(m.ftrndrv2)
  168.     DO (m.ftrndrv2) WITH m.projdbf,m.recno,m.dummy
  169.   ENDIF
  170.   RETURN m.gstatus
  171. ENDIF
  172. IF m.genscrnx=='OFF'.AND.EMPTY(m.doprogram)
  173.   IF USED('CONFIGFP')
  174.     USE IN CONFIGFP
  175.   ENDIF
  176.   IF .NOT.FILE(m.genscrn)
  177.     RETURN 2
  178.   ENDIF
  179.   RELEASE ALL LIKE ?_*
  180.   RELEASE ALL LIKE f*
  181.   RELEASE ALL LIKE last*
  182.   DO (m.genscrn) WITH m.projdbf,m.recno
  183.   RETURN m.gstatus
  184. ENDIF
  185. IF _WINDOWS.OR._MAC
  186.   SET MESSAGE TO ' '
  187. ENDIF
  188. m.fgenscx=configfp('_GENSCX','GENSCX')
  189. m.fupdspr=configfp('_UPDSPR','UPDSPR')
  190. a_fscxdrv=''
  191. a_scxdrv=''
  192. a_fsprdrv=''
  193. a_sprdrv=''
  194. a_drvoff=''
  195. m.drvoffs=0
  196. FOR m.i = 1 TO 8
  197.   a_scxdrvm(m.i)=0
  198.   m.find_str='_SCXDRV'+STR(m.i,1)
  199.   FOR m.j = 1 TO 255
  200.     m.memline=add_fext(configfp(m.find_str,'',m.j))
  201.     IF EMPTY(m.memline)
  202.       IF ATC(m.find_str,CONFIGFP.FP,m.j)=0
  203.         EXIT
  204.       ENDIF
  205.       LOOP
  206.     ENDIF
  207.     FOR m.k = 1 TO a_scxdrvm(m.i)
  208.       IF FULLPATH(a_fscxdrv(m.k,m.i))==FULLPATH(m.memline)
  209.         m.memline=''
  210.         EXIT
  211.       ENDIF
  212.     ENDFOR
  213.     IF EMPTY(m.memline)
  214.       LOOP
  215.     ENDIF
  216.     a_scxdrvm(m.i)=a_scxdrvm(m.i)+1
  217.     IF ALEN(a_fscxdrv)<(8*a_scxdrvm(m.i))
  218.       DIMENSION a_fscxdrv(a_scxdrvm(m.i),8)
  219.     ENDIF
  220.     a_fscxdrv(a_scxdrvm(m.i),m.i)=m.memline
  221.   ENDFOR
  222.   IF m.i>6
  223.     LOOP
  224.   ENDIF
  225.   a_sprdrvm(m.i)=0
  226.   m.find_str='_SPRDRV'+STR(m.i,1)
  227.   FOR m.j = 1 TO 255
  228.     m.memline=add_fext(configfp(m.find_str,'',m.j))
  229.     IF EMPTY(m.memline)
  230.       IF ATC(m.find_str,CONFIGFP.FP,m.j)=0
  231.         EXIT
  232.       ENDIF
  233.       LOOP
  234.     ENDIF
  235.     FOR m.k = 1 TO a_sprdrvm(m.i)
  236.       IF FULLPATH(a_fsprdrv(m.k,m.i))==FULLPATH(m.memline)
  237.         m.memline=''
  238.         EXIT
  239.       ENDIF
  240.     ENDFOR
  241.     IF EMPTY(m.memline)
  242.       LOOP
  243.     ENDIF
  244.     a_sprdrvm(m.i)=a_sprdrvm(m.i)+1
  245.     IF ALEN(a_fsprdrv)<(8*a_sprdrvm(m.i))
  246.       DIMENSION a_fsprdrv(a_sprdrvm(m.i),8)
  247.     ENDIF
  248.     a_fsprdrv(a_sprdrvm(m.i),m.i)=m.memline
  249.   ENDFOR
  250. ENDFOR
  251. m.compspr=IIF(TYPE('_COMPSPR')=='C',UPPER(_COMPSPR),;
  252.           configfp('COMPSPR','OFF'))
  253. m.dispspr=IIF(TYPE('_DISPSPR')=='C',UPPER(_DISPSPR),;
  254.           configfp('DISPSPR','OFF'))
  255. m.autorun=IIF(TYPE('_AUTORUN')=='C',UPPER(_AUTORUN),;
  256.           configfp('AUTORUN','OFF'))
  257. m.platonly=IIF(TYPE('_PLATONLY')=='C',UPPER(_PLATONLY),;
  258.            configfp('PLATONLY',''))
  259. m.autohalt=IIF(TYPE('_AUTOHALT')=='C',UPPER(_AUTOHALT),;
  260.            configfp('AUTOHALT','ON'))
  261. m.outtxt=IIF(TYPE('_OUTTXT')=='C',UPPER(_OUTTXT),;
  262.          configfp('OUTTXT','OFF'))
  263. m.scnobj=IIF(TYPE('_SCNOBJ')=='C',UPPER(_SCNOBJ),;
  264.          configfp('SCNOBJ','ON'))
  265. m.braces=IIF(TYPE('_BRACES')=='C',UPPER(_BRACES),;
  266.          configfp('BRACES','ON'))
  267. m.ignrbraces=.F.
  268. SET ESCAPE OFF
  269. m.lastonerror=ON('ERROR')
  270. ON ERROR DO errorhnd WITH ERROR(),MESSAGE(),PROGRAM(),LINENO(),MESSAGE(1)
  271. m.lastsetcomp=SET('COMPATIBLE')
  272. SET COMPATIBLE OFF
  273. m.lastsetexac=SET('EXACT')
  274. SET EXACT OFF
  275. m.lastsetsfty=SET('SAFETY')
  276. SET SAFETY OFF
  277. m.lastsetdel=SET('DELETED')
  278. SET DELETED OFF
  279. m.lastsetcry=SET('CARRY')
  280. SET CARRY OFF
  281. m.lastsetnear=SET('NEAR')
  282. SET NEAR OFF
  283. m.lastsetdec=SET('DECIMALS')
  284. SET DECIMALS TO 9
  285. m.lastsetexcl=SET('EXCLUSIVE')
  286. SET EXCLUSIVE ON
  287. m.lastsetudfp=SET('UDFPARMS')
  288. SET UDFPARMS TO VALUE
  289. m.lastmemow=SET('MEMOWIDTH')
  290. SET MEMOWIDTH TO 254
  291. ACTIVATE SCREEN
  292. SET CURSOR OFF
  293. IF WEXIST('_weditfile')
  294.   RELEASE WINDOW _weditfile
  295. ENDIF
  296. m.c_defobj='*:DEFOBJ'
  297. m.c_basobj='*:BASOBJ'
  298. m.c_insobj='*:INSOBJ'
  299. m.c_insscx='*:INSSCX'
  300. m.c_inclib='*:INCLIB'
  301. m.c_deflib='*:DEFLIB'
  302. m.c_baslib='*:BASLIB'
  303. m.c_instxt='*:INSTXT'
  304. m.c_trntxt='*:TRNTXT'
  305. m.c_memvar='*:MEMVAR'
  306. FOR m.i = 1 TO 8
  307.   a_c_scxdrv(m.i)='*:SCXDRV'+STR(i,1)
  308.   a_scxdrvs(m.i)=0
  309.   IF m.i>6
  310.     LOOP
  311.   ENDIF
  312.   a_c_sprdrv(m.i)='*:SPRDRV'+STR(i,1)
  313.   a_sprdrvs(m.i)=0
  314. ENDFOR
  315. m.c_delete='*:DELETE'
  316. m.c_delobj='*:DELOBJ'
  317. m.c_if='*:IF'
  318. m.c_size='*:SIZE'
  319. m.c_nosize='*:NOSIZE'
  320. m.c_svsize='*:SAVESIZE'
  321. m.c_svpict='*:SAVEPICT'
  322. m.c_click='*:CLICK'
  323. m.c_scnobj='*:SCNOBJ'
  324. m.c_noscnobj='*:NOSCNOBJ'
  325. m.c_braces='*:BRACES'
  326. m.c_nobraces='*:NOBRACES'
  327. m.c_ignrbrcs='*:IGNOREBRACES'
  328. m.c_evltxt='*:EVLTXT'
  329. m.c_basbefore='*:BASBEFORE'
  330. m.c_group='*:GROUP'
  331. m.c_default='*:DEFAULT'
  332. m.c_picture='*:PICTURE'
  333. m.c_refresh='*:REFRESH'
  334. m.c_nogen='*:NOGEN'
  335. m.c_noxgen='*:NOXGEN'
  336. m.c_compspr='*:COMPSPR'
  337. m.c_nocompspr='*:NOCOMPSPR'
  338. m.c_dispspr='*:DISPSPR'
  339. m.c_nodispspr='*:NODISPSPR'
  340. m.c_drvoff='*:DRVOFF'
  341. m.c_autorun='*:AUTORUN'
  342. m.c_noautorun='*:NOAUTORUN'
  343. m.c_genscrnx='*:GENSCRNX'
  344. m.c_insert='#:INSERT'
  345. m.p_insert='#INSE'
  346. m.c_name='*:NAME'
  347. m.p_name='#NAME'
  348. m.s_para='PARA'
  349. m.c_prg='*:PRG'
  350. m.c_outfile='*:OUTFILE'
  351. m.c_pjxset='*:PJXSET'
  352. m.c_set='*:SET'
  353. m.c_section3='#:SECTION 3'
  354. m.c_nowclaus='*:NOWCLAUSES'
  355. m.c_endtxt='*:ENDTXT'
  356. m.c_function='*:FUNCTION'
  357. m.c_method='*:METHOD'
  358. m.c_endfnct='*:ENDFNCT'
  359. m.c_endmthd='*:ENDMTHD'
  360. m.m_deflib='*-:DEFLIB'
  361. m.m_defobj='*-:DEFOBJ'
  362. m.m_basobj='*-:BASOBJ'
  363. m.m_instxt='*-:INSTXT'
  364. m.m_delete='*-:DELETE'
  365. m.m_if='*-:IF'
  366. m.m_size='*-:SIZE'
  367. m.m_nosize='*-:NOSIZE'
  368. m.m_svsize='*-:SAVESIZE'
  369. m.m_svpict='*-:SAVEPICT'
  370. m.m_basbefore='*-:BASBEFORE'
  371. m.m_default='*-:DEFAULT'
  372. m.m_picture='*-:PICTURE'
  373. m.m_section3='*-#SECTION 3'
  374. m.m_method='*-:METHOD'
  375. IF _MAC
  376.   m.c_dlgface="Geneva"
  377.   m.c_dlgsize=10
  378.   m.c_dlgstyle=""
  379. ELSE
  380.   m.c_dlgface="MS Sans Serif"
  381.   m.c_dlgsize=8
  382.   m.c_dlgstyle="B"
  383. ENDIF
  384. m.badchars=' /\,-=:;{}[]!@#$%^&*.<>()+|'+CHR(34)+CHR(39)
  385. m.stdascii=''
  386. m.eval_cmnt='SUBSTR(COMMENT,MAX(ATC(m.c_defobj,COMMENT),'+;
  387.             'ATC(m.m_defobj,COMMENT)))'
  388. DIMENSION a_inclib(1),a_baslib(1)
  389. m.inclibs=0
  390. m.baslibs=0
  391. DIMENSION a_fnctname(1,2)
  392. m.fnctnames=0
  393. DIMENSION a_fscxdata(1),a_scxupd(1),a_scxalias(1),a_nowclaus(1,4)
  394. a_scxupd=''
  395. a_nowclaus=''
  396. m.scxcount=0
  397. m.cscxcount='0'
  398. m.screens=0
  399. m.platform_=''
  400. m.splatform_=m.cplatform_
  401. m.fcountadj=IIF(_FOX25,8,9)
  402. m.ffoxscx2=''
  403. m.fpjxbase=STRTRAN(m.projdbf,CHR(0),'')
  404. m.fscxbase=''
  405. m.fscxdata=''
  406. m.fsprout=''
  407. m.fspxout=''
  408. m.fsprerr=''
  409. m.scx_name=''
  410. m.newsetpath=''
  411. m.projpath=''
  412. m.lib_mode=.F.
  413. m.gen_mode=.T.
  414. m.xgen_mode=.T.
  415. m.fromproj=.T.
  416. m.pjxset=.F.
  417. m.drv_no=0
  418. m.drv_cnt=0
  419. m.r_pjxbase=m.recno
  420. m.r_scxdata=1
  421. m.allplatforms=.F.
  422. m.updsprflag=.F.
  423. IF .NOT.EMPTY(m.doprogram)
  424.   m.doprogram=FULLPATH(add_fext(m.doprogram))
  425.   m.gen_mode=.F.
  426.   m.xgen_mode=.F.
  427.   m.lib_mode=.F.
  428.   m.fgenscx=''
  429.   IF FILE(m.doprogram)
  430.     DO (m.doprogram)
  431.   ELSE
  432.     =warning("GENSCRNX could not DO "+m.doprogram)
  433.     m.fgenscx=''
  434.   ENDIF
  435. ELSE
  436.   IF .NOT.EMPTY(m.ffoxscx)
  437.     IF m.fgenscx=='GENSCX'.OR.FILE(m.fgenscx)
  438.       CLEAR TYPEAHEAD
  439.       DO (m.fgenscx) WITH m.projdbf,m.recno
  440.     ELSE
  441.       =warning('_GENSCX =',m.fgenscx)
  442.       m.fgenscx=''
  443.     ENDIF
  444.   ELSE
  445.     m.fgenscx=''
  446.   ENDIF
  447. ENDIF
  448. RELEASE a_fscxdrv,a_scxdrv,a_scxdrvs,a_scxdrvm,a_c_scxdrv
  449. IF m.gen_mode
  450.   IF FILE(m.genscrn)
  451.     IF EMPTY(m.lastsetpath)
  452.       SET PATH TO
  453.     ELSE
  454.       SET PATH TO (m.lastsetpath)
  455.     ENDIF
  456.     m.memtemp1=uniqueflnm()+'.MEM'
  457.     SAVE TO (m.memtemp1) ALL LIKE ?_*
  458.     RELEASE ALL LIKE ?_*
  459.     m.memtemp2=uniqueflnm()+'.MEM'
  460.     SAVE TO (m.memtemp2) ALL LIKE f*
  461.     RELEASE ALL LIKE f*
  462.     m.memtemp3=uniqueflnm()+'.MEM'
  463.     SAVE TO (m.memtemp3) ALL LIKE last*
  464.     RELEASE ALL LIKE last*
  465.     CLEAR TYPEAHEAD
  466.     ON ERROR
  467.     DO (m.genscrn) WITH m.projdbf,m.recno
  468.     SET ESCAPE OFF
  469.     ON ERROR DO errorhnd WITH ERROR(),MESSAGE(),PROGRAM(),LINENO(),MESSAGE(1)
  470.     IF _WINDOWS.OR._MAC
  471.       SET MESSAGE TO ' '
  472.     ENDIF
  473.     IF FILE(m.memtemp1)
  474.       RESTORE FROM (m.memtemp1) ADDITIVE
  475.       ERASE (m.memtemp1)
  476.     ENDIF
  477.     IF FILE(m.memtemp2)
  478.       RESTORE FROM (m.memtemp2) ADDITIVE
  479.       ERASE (m.memtemp2)
  480.     ENDIF
  481.     IF FILE(m.memtemp3)
  482.       RESTORE FROM (m.memtemp3) ADDITIVE
  483.       ERASE (m.memtemp3)
  484.     ENDIF
  485.     DO restoreenv
  486.   ELSE
  487.     =warning('_GENSCRNX =',m.genscrn)
  488.     m.genscrn=''
  489.   ENDIF
  490. ELSE
  491.   m.genscrn=''
  492. ENDIF
  493. IF m.xgen_mode.AND..NOT.m.lib_mode.AND.FILE(m.fsprout)
  494.   IF m.fupdspr=='UPDSPR'.OR.FILE(m.fupdspr)
  495.     CLEAR TYPEAHEAD
  496.     DO (m.fupdspr) WITH m.projdbf,m.recno
  497.   ELSE
  498.     =warning('_UPDSPR =',m.fupdspr)
  499.     m.fupdspr=''
  500.   ENDIF
  501. ELSE
  502.   m.fupdspr=''
  503. ENDIF
  504. DO cleanup WITH .T.
  505. IF m.lastsettr=='ON'
  506.   SET TRBETWEEN ON
  507. ELSE
  508.   SET TRBETWEEN OFF
  509. ENDIF
  510. RETURN m.gstatus
  511.  
  512. * END genscrnx
  513.  
  514.  
  515.  
  516. FUNCTION genscx
  517. PARAMETER projdbf,recno
  518. PRIVATE screenset,obj_lib,obj_name,obj_base,obj_field,obj_expr
  519. PRIVATE lib_name,lib_upd,loop_plat,loop_flag,loop_obj,loop_def
  520. PRIVATE lastslct,lastexac,lastfilter,winrelease,scx_file
  521. PRIVATE insscxs,memvarmode,basbefore,screenend,setupcd,section3
  522. PRIVATE basobjs,setfilter,field_name,field_eval,field_type
  523. PRIVATE old_text,new_text,match,match_drv,match_pos,match_no
  524. PRIVATE snpttype,snptname,snptname_,storesize,fnctname,paramlist
  525. PRIVATE name_mode,scx_alias,file_ext,comp_flag,gsx_flag,set_mode
  526. PRIVATE rec_count,rec_total,str_data,str_data2,str_data3
  527. PRIVATE r,r2,memline,at_pos,at_pos2,at_line,i,j,k
  528. PRIVATE vpos2,hpos2,height2,width2
  529.  
  530. m.lastslct=SELECT()
  531. IF USED('FOXSCX')
  532.   USE IN FOXSCX
  533. ENDIF
  534. IF USED('_PJXDATA')
  535.   SELECT _PJXDATA
  536.   USE
  537. ELSE
  538.   SELECT 0
  539. ENDIF
  540. IF USED('PJXBASE')
  541.   USE IN PJXBASE
  542. ENDIF
  543. IF USED('PJXDATA')
  544.   SELECT PJXDATA
  545.   USE
  546. ELSE
  547.   SELECT 0
  548. ENDIF
  549. USE (m.projdbf) AGAIN ALIAS PJXBASE
  550. SET FILTER TO .NOT.DELETED()
  551. LOCATE
  552. IF .NOT.TYPE=='H'
  553.   LOCATE FOR TYPE=='H'
  554.   IF EOF()
  555.     USE
  556.     SELECT (m.lastslct)
  557.     RETURN m.gstatus
  558.   ENDIF
  559. ENDIF
  560. m.projpath=MLINE(NAME,1)
  561. IF .NOT.'\'$m.projpath
  562.   m.projpath=FULLPATH(m.projpath,m.projdbf)
  563. ENDIF
  564. m.projdbf=FULLPATH(uniqueflnm(),m.projdbf)
  565. GOTO m.recno
  566. IF TYPE==m.null
  567.   m.recno=2
  568. ELSE
  569.   m.recno=3
  570. ENDIF
  571. m.i=SETID
  572. IF m.i=0
  573.   m.fromproj=.F.
  574. ENDIF
  575. IF m.i=0
  576.   COPY TO (m.projdbf)
  577. ELSE
  578.   COPY TO (m.projdbf) FOR SETID=m.i.AND.UPPER(TYPE)=='S'
  579. ENDIF
  580. LOCATE
  581. SELECT PJXBASE
  582. LOCATE FOR TYPE=='H'
  583. IF EOF()
  584.   LOCATE
  585. ENDIF
  586. IF RECNO()>m.r_pjxbase
  587.   m.r_pjxbase=m.r_pjxbase+1
  588. ENDIF
  589. RELEASE a_scatter
  590. SCATTER TO a_scatter MEMO
  591. SELECT 0
  592. USE (m.projdbf) ALIAS PJXDATA
  593. LOCATE
  594. IF m.i#0
  595.   INSERT BLANK BEFORE
  596.   GATHER FROM a_scatter MEMO
  597.   REPLACE SETID WITH m.i
  598. ENDIF
  599. RELEASE a_scatter
  600. LOCATE FOR TYPE==m.null.OR.TYPE=='S'
  601. IF m.fromproj.AND.RECNO()<=2
  602.   SCATTER TO a_scatter MEMO
  603.   DELETE
  604.   APPEND BLANK
  605.   GATHER FROM a_scatter MEMO
  606.   RELEASE a_scatter
  607.   PACK
  608.   LOCATE FOR TYPE==m.null.OR.TYPE=='S'
  609.   m.r_pjxbase=RECNO()
  610. ENDIF
  611. IF EOF()
  612.   USE
  613.   SELECT (m.lastslct)
  614.   RETURN m.gstatus
  615. ENDIF
  616. m.recno=RECNO()
  617. COUNT TO m.screens FOR SETID=m.i.AND.TYPE=='s'
  618. IF m.screens=0
  619.   m.screens=1
  620. ENDIF
  621. DIMENSION a_scxalias(m.screens),a_nowclaus(m.screens,4)
  622. GOTO m.recno
  623. DO CASE
  624.   CASE TYPE('SAVECODE')#'L'
  625.     m.allplatforms=.T.
  626.   CASE m.platonly=='ON'
  627.     m.allplatforms=.F.
  628.     REPLACE SAVECODE WITH .T.
  629.   CASE m.platonly=='OFF'
  630.     m.allplatforms=.T.
  631.     REPLACE SAVECODE WITH .F.
  632.   OTHERWISE
  633.     m.allplatforms=.NOT.SAVECODE
  634. ENDCASE
  635. m.memline=MLINE(OUTFILE,1)
  636. IF m.fromproj
  637.   m.fsprout=FULLPATH(STRTRAN(ALLTRIM(m.memline),m.null,''),m.projpath)
  638. ELSE
  639.   IF _WINDOWS
  640.     m.fsprout=SUBSTR(FULLPATH(STRTRAN(STRTRAN(ALLTRIM(m.memline),;
  641.               '..\',''),m.null,'')),3)
  642.     IF ':'$m.memline
  643.       m.fsprout=LEFT(m.memline,2)+m.fsprout
  644.     ENDIF  
  645.   ELSE
  646.     m.fsprout=FULLPATH(STRTRAN(ALLTRIM(m.memline),m.null,''),m.projpath)
  647.   ENDIF
  648. ENDIF
  649. IF .NOT.':'$m.fsprout
  650.   SKIP -1
  651.   IF SUBSTR(MLINE(NAME,1),2,1)==':'
  652.     m.fsprout=LEFT(MLINE(NAME,1),2)+m.fsprout
  653.   ENDIF
  654. ENDIF
  655. GOTO m.recno
  656. m.fromproj=.NOT.EMPTY(TYPE).AND.ASC(TYPE)>0
  657. IF m.fromproj
  658.   m.at_pos=RAT('\',m.projpath)
  659.   IF m.at_pos>0
  660.     IF .NOT.LEFT(m.fsprout,1)=='\'.AND..NOT.':'$m.fsprout
  661.       m.fsprout=LEFT(m.projpath,m.at_pos)+m.fsprout
  662.     ENDIF
  663.   ELSE
  664.     LOCATE
  665.     m.fsprout=FULLPATH(m.fsprout,HOMEDIR)
  666.   ENDIF
  667. ELSE
  668.   m.fsprout=FULLPATH(m.fsprout,HOMEDIR)
  669. ENDIF
  670. GOTO m.recno
  671. m.file_ext=UPPER(RIGHT(m.fsprout,4))
  672. DO CASE
  673.   CASE m.file_ext=='.SPR'
  674.     m.file_ext='.SPX'
  675.   CASE m.file_ext=='.MPR'
  676.     m.file_ext='.MPX'
  677.   OTHERWISE
  678.     m.file_ext='.FXP'
  679. ENDCASE
  680. m.fspxout=trimext(m.fsprout)+m.file_ext
  681. m.fsprerr=trimext(m.fsprout)+'.ERR'
  682. IF m.fromproj
  683.   REPLACE OUTFILE WITH m.fsprout+m.null, HOMEDIR WITH ''
  684. ENDIF
  685. m.winrelease=trimpath(m.fsprerr)
  686. IF WEXIST(m.winrelease)
  687.   RELEASE WINDOW (m.winrelease)
  688. ENDIF
  689. IF FILE(m.fsprerr)
  690.   ERASE (m.fsprerr)
  691. ENDIF
  692. IF FILE(m.fspxout)
  693.   ERASE (m.fspxout)
  694. ENDIF
  695. IF m.fromproj
  696.   SELECT PJXBASE
  697.   GOTO m.r_pjxbase
  698.   IF RECNO()>=4
  699.     SKIP -2
  700.     IF .NOT.EOF()
  701.       GOTO m.r_pjxbase
  702.       SKIP -1
  703.       m.i=0
  704.       IF ATC('.SCX',NAME)=0
  705.         SKIP 2
  706.       ENDIF
  707.       SKIP -1
  708.       IF ATC('.SPR',NAME)=0
  709.         SKIP -1
  710.       ENDIF
  711.       IF ATC('.SPR',NAME)>0
  712.         m.fsprout2=FULLPATH(STRTRAN(ALLTRIM(MLINE(NAME,1)),m.null,''),m.fsprout)
  713.         m.fspxout2=trimext(m.fsprout2)+'.SPX'
  714.         IF FILE(m.fsprout2).AND..NOT.FILE(m.fspxout2)
  715.           IF ADIR(a_dir,m.fsprout2)=1.AND.a_dir(1,2)=0
  716.             ERASE (m.fsprout2)
  717.           ENDIF
  718.           RELEASE a_dir
  719.         ENDIF
  720.       ENDIF
  721.     ENDIF
  722.   ENDIF
  723. ENDIF
  724. m.screenend=.F.
  725. IF m.fromproj
  726.   SELECT PJXBASE
  727.   GOTO m.r_pjxbase
  728.   m.i=SETID
  729.   SKIP 2
  730.   IF EOF().OR.SETID=0
  731.     m.screenend=.T.
  732.   ENDIF
  733. ENDIF
  734. SELECT PJXBASE
  735. IF m.recno>RECCOUNT()
  736.   LOCATE FOR TYPE==m.null.OR.TYPE=='S'
  737.   IF EOF()
  738.     LOCATE
  739.   ELSE
  740.     m.recno=RECNO()
  741.   ENDIF
  742. ENDIF
  743. GOTO m.recno
  744. m.msg1=''
  745. m.loop_plat=.F.
  746. m.screenset=.F.
  747. m.comp_flag=.F.
  748. DO WHILE .T.
  749.   DO WHILE .T.
  750.     =esc_check()
  751.     IF USED('SCXDATA')
  752.       m.rec_count=RECCOUNT('SCXDATA')
  753.     ENDIF
  754.     m.platform_=ALLTRIM(m.platform_)
  755.     DO CASE
  756.       CASE EMPTY(m.platform_)
  757.         IF m.allplatforms
  758.           m.platform_=m.cplatform_
  759.         ELSE
  760.           DO CASE
  761.             CASE _WINDOWS
  762.               m.platform_='WINDOWS'
  763.             CASE _MAC
  764.               m.platform_='MAC'
  765.             CASE _UNIX
  766.               m.platform_='UNIX'
  767.             OTHERWISE
  768.               m.platform_='DOS'
  769.           ENDCASE
  770.         ENDIF
  771.       CASE .NOT._FOX25.OR..NOT.m.allplatforms
  772.         EXIT
  773.       CASE m.platform_==m.null
  774.         m.platform_=m.splatform_
  775.       CASE .NOT.USED('SCXDATA')
  776.         =.F.
  777.       OTHERWISE
  778.         DO CASE
  779.           CASE m.platform_=='DOS'
  780.             m.platform_='WINDOWS'
  781.           CASE m.platform_=='WINDOWS'
  782.             m.platform_='MAC'
  783.           CASE m.platform_=='MAC'
  784.             m.platform_='UNIX'
  785.           CASE m.platform_=='UNIX'.AND..NOT.ALLTRIM(m.splatform_)=='DOS'
  786.             m.platform_='DOS'
  787.           OTHERWISE
  788.             EXIT
  789.         ENDCASE
  790.         IF m.platform_==ALLTRIM(m.splatform_)
  791.           EXIT
  792.         ENDIF
  793.     ENDCASE
  794.     m.platform_=PADR(m.platform_,8)
  795.     IF .NOT.m.allplatforms.OR.m.platform_==m.splatform_
  796.       m.name_mode=.F.
  797.       SELECT PJXDATA
  798.       IF .NOT.TYPE=='s'
  799.         LOCATE FOR TYPE=='s'
  800.       ENDIF
  801.       IF EOF()
  802.         EXIT
  803.       ENDIF
  804.       IF m.fromproj
  805.         m.fscxbase=ALLTRIM(MLINE(NAME,1))
  806.         IF .NOT.FILE(m.fscxbase).OR.LEFT(m.fscxbase,4)=='..\\'
  807.           IF LEFT(m.fscxbase,4)=='..\\'
  808.             m.fscxbase=SUBSTR(m.fscxbase,4)
  809.             IF .NOT.':'$m.fscxbase.AND.SUBSTR(m.projpath,2,1)==':'
  810.               m.fscxbase=LEFT(m.projpath,2)+m.fscxbase
  811.             ENDIF
  812.           ENDIF
  813.           IF .NOT.FILE(m.fscxbase)
  814.             m.at_pos=RAT('\',m.projpath)
  815.             IF m.at_pos>0.AND..NOT.LEFT(m.fscxbase,1)=='\'.AND.;
  816.                .NOT.':'$m.fscxbase
  817.               m.fscxbase=LEFT(m.projpath,m.at_pos)+m.fscxbase
  818.             ELSE
  819.               LOCATE
  820.               m.fscxbase=FULLPATH(trimpath(m.fscxbase),HOMEDIR)
  821.               IF .NOT.FILE(m.fscxbase)
  822.                 m.fscxbase=FULLPATH(trimpath(m.fscxbase),m.projpath)
  823.               ENDIF
  824.             ENDIF
  825.           ENDIF
  826.         ENDIF
  827.         IF '\\'$m.fscxbase
  828.           IF SUBSTR(m.fscxbase,2,1)==':'
  829.             m.fscxbase=LEFT(m.fscxbase,2)+'\'+trimpath(m.fscxbase)
  830.           ELSE
  831.             m.fscxbase='\'+trimpath(m.fscxbase)
  832.           ENDIF
  833.         ENDIF
  834.       ELSE
  835.         m.fscxbase=SUBSTR(FULLPATH(STRTRAN(ALLTRIM(MLINE(NAME,1)),'..\','')),3)
  836.         IF .NOT.'\'$m.fscxbase
  837.           LOCATE
  838.           m.fscxbase=FULLPATH(m.fscxbase,NAME)
  839.         ELSE
  840.           IF .NOT.':'$m.fscxbase
  841.             IF SUBSTR(m.fsprout,2,1)==':'
  842.               m.fscxbase=LEFT(m.fsprout,2)+m.fscxbase
  843.             ENDIF
  844.           ENDIF
  845.           IF .NOT.FILE(m.fscxbase)
  846.             m.fscxbase=trimpath(m.fscxbase)
  847.             IF .NOT.FILE(m.fscxbase)
  848.               LOCATE
  849.               m.fscxbase=FULLPATH(m.fscxbase,NAME)
  850.             ENDIF
  851.           ENDIF
  852.         ENDIF
  853.       ENDIF
  854.       m.fscxbase=STRTRAN(m.fscxbase,m.null,'')
  855.       IF EOF().OR..NOT.FILE(m.fscxbase)
  856.         EXIT
  857.       ENDIF
  858.       IF USED('SCXBASE')
  859.         SELECT SCXBASE
  860.         USE
  861.       ELSE
  862.         SELECT 0
  863.       ENDIF
  864.       USE (m.fscxbase) ALIAS SCXBASE AGAIN
  865.       IF TYPE('PLATFORM')=='C'
  866.         LOCATE FOR OBJTYPE=1.AND.PLATFORM==m.cplatform_
  867.       ELSE
  868.         LOCATE FOR OBJTYPE=1
  869.       ENDIF
  870.       IF EOF()
  871.         IF TYPE('PLATFORM')#'C'
  872.           EXIT
  873.         ENDIF
  874.         LOCATE FOR OBJTYPE=1.AND.PLATFORM==m.splatform_
  875.         IF EOF()
  876.           LOCATE FOR OBJTYPE=1
  877.           IF EOF()
  878.             EXIT
  879.           ENDIF
  880.           m.splatform_=PLATFORM
  881.           m.platform_=m.null
  882.           IF m.platonly=='ON'
  883.             m.gen_mode=.F.
  884.             EXIT
  885.           ENDIF
  886.           LOOP
  887.         ENDIF
  888.       ENDIF
  889.       IF USED('FOXSCX')
  890.         SELECT FOXSCX
  891.         IF TYPE('PLATFORM')=='C'
  892.           SET FILTER TO PLATFORM==m.platform_
  893.         ELSE
  894.           SET FILTER TO
  895.         ENDIF
  896.         SET ORDER TO OBJNAME_
  897.         LOCATE
  898.       ENDIF
  899.       SELECT SCXBASE
  900.       SCATTER MEMVAR MEMO
  901.       m.setupcd=SETUPCODE
  902.       m.setupcd=evltxt(m.setupcd)
  903.       m.gsx_flag=(.NOT.SETUPCODE==m.setupcd)
  904.       m.at_line=ATCLINE(m.c_noxgen,m.setupcd)
  905.       IF m.at_line>0
  906.         m.memline=ALLTRIM(MLINE(m.setupcd,m.at_line))
  907.         m.at_pos=ATC(m.c_noxgen,m.memline)
  908.         IF m.at_pos=1
  909.           m.xgen_mode=.F.
  910.           EXIT
  911.         ENDIF
  912.       ENDIF
  913.       IF m.platonly=='ON'
  914.         m.setupcd='*:SET PLATONLY ON'+m.cr_lf+m.setupcd
  915.       ENDIF
  916.       m.j=0
  917.       FOR m.i = 1 TO 8
  918.         IF .NOT.EMPTY(a_fscxdrv(1,m.i)).OR.(m.i<=6.AND.;
  919.            .NOT.EMPTY(a_fsprdrv(1,m.i)))
  920.           m.j=1
  921.           EXIT
  922.         ENDIF
  923.       ENDFOR
  924.       IF .NOT.m.gsx_flag.AND.m.j=0.AND..NOT.'*:'$m.setupcd.AND.;
  925.          .NOT.m.c_insert$m.setupcd.AND..NOT.m.c_section3$m.setupcd
  926.         LOCATE FOR '*:'$COMMENT.OR.('{{'$COMMENT.AND.'}}'$COMMENT)
  927.         IF EOF()
  928.           EXIT
  929.         ENDIF
  930.       ENDIF
  931.       m.msg1='Initializing Screen Database...'
  932.       m.msg2=trimpath(STRTRAN(IIF(_WINDOWS.OR._MAC,LOWER(m.fscxbase),;
  933.              UPPER(m.fscxbase)),m.null,''))
  934.       DO delaybar WITH m.msg1,m.msg2,0,.NOT.WEXIST('_wdelaybar')
  935.       m.scxcount=m.scxcount+1
  936.       m.cscxcount=ALLTRIM(STR(m.scxcount,2))
  937.       FOR m.i = 1 TO m.screens
  938.         a_scxalias(m.i)=uniqueflnm()+'.DBF'
  939.         IF USED(a_scxalias(m.i))
  940.           USE IN (a_scxalias(m.i))
  941.         ENDIF
  942.       ENDFOR
  943.       m.fscxdata=FULLPATH(a_scxalias(m.scxcount),FULLPATH(m.fscxbase,m.fpjxbase))
  944.       DIMENSION a_fscxdata(m.scxcount),a_scxupd(m.scxcount)
  945.       a_fscxdata(m.scxcount)=m.fscxdata
  946.       IF TYPE('PLATFORM')#'C'
  947.         _FOX25=.F.
  948.       ENDIF
  949.       SELECT * FROM SCXBASE INTO TABLE (m.fscxdata)
  950.       USE
  951.       IF USED('SCXDATA')
  952.         SELECT SCXDATA
  953.         USE
  954.       ELSE
  955.         SELECT 0
  956.       ENDIF
  957.       USE (m.fscxdata) ALIAS SCXDATA
  958.       IF TYPE('PLATFORM')=='C'
  959.         LOCATE FOR OBJTYPE=1.AND.PLATFORM==m.splatform_
  960.       ELSE
  961.         LOCATE FOR OBJTYPE=1
  962.       ENDIF
  963.       IF EOF()
  964.         EXIT
  965.       ENDIF
  966.       m.setupcd=SETUPCODE
  967.       SCATTER MEMVAR MEMO
  968.       m.setupcd=evltxt(m.setupcd)
  969.       m.section3=''
  970.       m.at_pos=ATC(m.c_section3,m.setupcd)
  971.       IF m.at_pos>0.AND..NOT.wordsearch(m.c_section3,'m.setupcd')==m.null
  972.         m.section3=SUBSTR(m.setupcd,m.at_pos)
  973.         m.setupcd=LEFT(m.setupcd,m.at_pos-1)
  974.       ENDIF
  975.       m.setupcd=m.setupcd+m.cr_lf+REPLICATE('*',65)+m.cr_lf+;
  976.                 '*           This program was preprocessed by GENSCRNX.'+;
  977.                 m.cr_lf++'*'+m.cr_lf+;
  978.                 '*--GENSCRNX  '+m.gsxversion+m.cr_lf+;
  979.                 '*--Platform  '+VERSION()+m.cr_lf+;
  980.                 '*--Screen    '+m.fscxbase+m.cr_lf+;
  981.                 IIF(m.fromproj,'*--Project   '+m.fpjxbase+m.cr_lf,'')+;
  982.                 '*--FOXSCX    '+ALLTRIM(m.ffoxscx)+m.cr_lf+;
  983.                 '*--Time      '+DTOC(DATE())+' '+TIME()+m.cr_lf+;
  984.                 '*'+m.cr_lf+REPLICATE('*',65)+m.cr_lf+m.section3
  985.       REPLACE SETUPCODE WITH m.setupcd
  986.       SCATTER MEMVAR MEMO
  987.       m.setupcd=''
  988.       m.section3=''
  989.       m.rec_count=RECCOUNT()
  990.       DO delaybar WITH '','',100
  991.       m.msg1=''
  992.       IF m.scxcount>=2.AND.m.lib_mode.AND.wordsearch(m.c_deflib)==m.null
  993.         LOOP
  994.       ENDIF
  995.     ENDIF
  996.     IF .NOT.USED('SCXDATA')
  997.       IF .NOT._FOX25
  998.         =warning("GENSCRNX could not preprocess file")
  999.         EXIT
  1000.       ENDIF
  1001.       LOCATE
  1002.       IF EOF()
  1003.         EXIT
  1004.       ENDIF
  1005.       m.splatform_=ALLTRIM(m.splatform_)
  1006.       DO CASE
  1007.         CASE m.splatform_=='WINDOWS'
  1008.           m.splatform_='DOS'
  1009.         CASE m.splatform_=='MAC'
  1010.           m.splatform_='WINDOWS'
  1011.         CASE m.splatform_=='UNIX'
  1012.           m.splatform_='MAC'
  1013.         CASE m.splatform_=='DOS'
  1014.           m.splatform_='UNIX'
  1015.         OTHERWISE
  1016.           EXIT
  1017.       ENDCASE
  1018.       m.splatform_=PADR(m.splatform_,8)
  1019.       m.platform_=m.null
  1020.       LOOP
  1021.     ENDIF
  1022.     m.screenset=.F.
  1023.     SELECT SCXDATA
  1024.     IF TYPE('PLATFORM')=='C'
  1025.       SET FILTER TO PLATFORM==m.platform_.AND.OBJTYPE#2.AND.OBJTYPE#10.AND.;
  1026.                     OBJTYPE#23
  1027.     ELSE
  1028.       SET FILTER TO OBJTYPE#2.AND.OBJTYPE#10.AND.OBJTYPE#23
  1029.     ENDIF 
  1030.     LOCATE
  1031.     IF EOF()
  1032.       LOOP
  1033.     ENDIF
  1034.     IF .NOT.m.lib_mode.AND..NOT.EMPTY(m.msg1)
  1035.       m.msg2=IIF(m.gen_mode,'['+ALLTRIM(m.platform_)+']','')
  1036.       DO delaybar WITH m.msg1,m.msg2,.1
  1037.     ENDIF
  1038.     IF USED('FOXSCX')
  1039.       SELECT FOXSCX
  1040.       IF TYPE('PLATFORM')=='C'
  1041.         SET FILTER TO PLATFORM==m.platform_
  1042.       ELSE
  1043.         SET FILTER TO
  1044.       ENDIF
  1045.       SET ORDER TO OBJNAME_
  1046.       LOCATE
  1047.       SELECT SCXDATA
  1048.     ENDIF
  1049.     COUNT TO m.rec_total
  1050.     LOCATE FOR OBJTYPE#1
  1051.     m.r_scxdata=IIF(EOF(),m.r_scxdata,RECNO())
  1052.     LOCATE
  1053.     m.setupcd=SETUPCODE
  1054.     m.setupcd=evltxt(m.setupcd)
  1055.     LOCATE
  1056.     m.section3=''
  1057.     m.at_pos=ATC(m.c_section3,m.setupcd)
  1058.     IF m.at_pos>0.AND..NOT.wordsearch(m.c_section3,'m.setupcd')==m.null
  1059.       m.section3=strtranc(SUBSTR(m.setupcd,m.at_pos),m.c_section3,;
  1060.                  m.m_section3)
  1061.       m.setupcd=LEFT(m.setupcd,m.at_pos-1)
  1062.     ENDIF
  1063.     REPLACE SETUPCODE WITH m.setupcd
  1064.     m.setupcd=''
  1065.     SCATTER MEMVAR MEMO
  1066.     m.scx_name=trimpath(m.fscxbase,.T.)
  1067.     m.lib_name=m.scx_name
  1068.     str_data=';'+ALLTRIM(FULLPATH(' ',m.fscxbase))+';'
  1069.     IF ATC(str_data,m.lastsetpath)=0
  1070.       m.newsetpath=m.lastsetpath+str_data
  1071.     ENDIF
  1072.     SET PATH TO (m.newsetpath)
  1073.     a_inclib=''
  1074.     a_baslib=''
  1075.     DIMENSION a_inclib(1),a_baslib(1)
  1076.     m.inclibs=0
  1077.     m.baslibs=0
  1078.     m.memvarmode=.F.
  1079.     m.match_drv=.F.
  1080.     FOR m.i = 1 TO 8
  1081.       a_scxdrvs(m.i)=0
  1082.       FOR m.k = 1 TO a_scxdrvm(m.i)
  1083.         IF FILE(a_fscxdrv(m.k,m.i))
  1084.           m.match_drv=.T.
  1085.           a_scxdrvs(m.i)=a_scxdrvs(m.i)+1
  1086.           IF ALEN(a_scxdrv)<(8*a_scxdrvs(m.i))
  1087.             DIMENSION a_scxdrv(a_scxdrvs(m.i),8)
  1088.           ENDIF
  1089.           a_scxdrv(a_scxdrvs(m.i),m.i)=a_fscxdrv(m.k,m.i)
  1090.         ELSE
  1091.           =warning(a_c_scxdrv(m.i),a_fscxdrv(m.k,m.i))
  1092.         ENDIF
  1093.       ENDFOR
  1094.       IF m.i>6
  1095.         LOOP
  1096.       ENDIF
  1097.       a_sprdrvs(m.i)=0
  1098.       FOR m.k = 1 TO a_sprdrvm(m.i)
  1099.         IF FILE(a_fsprdrv(m.k,m.i))
  1100.           a_sprdrvs(m.i)=a_sprdrvs(m.i)+1
  1101.           IF ALEN(a_sprdrv)<(8*a_sprdrvs(m.i))
  1102.             DIMENSION a_sprdrv(a_sprdrvs(m.i),8)
  1103.           ENDIF
  1104.           a_sprdrv(a_sprdrvs(m.i),m.i)=a_fsprdrv(m.k,m.i)
  1105.         ELSE
  1106.           =warning(a_c_sprdrv(m.i),a_fsprdrv(m.k,m.i))
  1107.         ENDIF
  1108.       ENDFOR
  1109.     ENDFOR
  1110.     m.loop_plat=.T.
  1111.     m.at_line=ATCLINE(m.c_drvoff,SETUPCODE)
  1112.     IF m.at_line>0
  1113.       m.i=m.at_line-1
  1114.       DO WHILE m.i<MEMLINES(SETUPCODE)
  1115.         m.i=m.i+1
  1116.         m.memline=ALLTRIM(MLINE(SETUPCODE,m.i))
  1117.         IF m.i>m.at_line.AND..NOT.'*:'$m.memline
  1118.           m.at_pos=AT(m.cr,SETUPCODE,m.i)+1
  1119.           IF m.at_pos=1.OR.ATC(m.c_drvoff,SUBSTR(SETUPCODE,m.at_pos))=0
  1120.             EXIT
  1121.           ENDIF
  1122.           LOOP
  1123.         ENDIF
  1124.         m.at_pos=ATC(m.c_drvoff,m.memline)
  1125.         IF m.at_pos=1
  1126.           m.memline=add_fext(ALLTRIM(SUBSTR(m.memline,m.at_pos+;
  1127.                     LEN(m.c_drvoff))))
  1128.           IF EMPTY(m.memline)
  1129.             LOOP
  1130.           ENDIF
  1131.           m.drvoffs=m.drvoffs+1
  1132.           DIMENSION a_drvoff(m.drvoffs)
  1133.           a_drvoff(m.drvoffs)=FULLPATH(m.memline)
  1134.         ENDIF
  1135.       ENDDO
  1136.     ENDIF
  1137.     m.at_line=ATCLINE(a_c_scxdrv(1),SETUPCODE)
  1138.     IF m.at_line>0
  1139.       m.i=m.at_line-1
  1140.       DO WHILE m.i<MEMLINES(SETUPCODE)
  1141.         m.i=m.i+1
  1142.         m.memline=ALLTRIM(MLINE(SETUPCODE,m.i))
  1143.         IF m.i>m.at_line.AND..NOT.'*:'$m.memline
  1144.           m.at_pos=AT(m.cr,SETUPCODE,m.i)+1
  1145.           IF m.at_pos=1.OR.ATC(a_c_scxdrv(1),SUBSTR(SETUPCODE,m.at_pos))=0
  1146.             EXIT
  1147.           ENDIF
  1148.           LOOP
  1149.         ENDIF
  1150.         m.at_pos=ATC(a_c_scxdrv(1),m.memline)
  1151.         IF m.at_pos=1
  1152.           m.memline=add_fext(ALLTRIM(SUBSTR(m.memline,m.at_pos+;
  1153.                     LEN(a_c_scxdrv(1)))))
  1154.           IF EMPTY(m.memline).OR..NOT.FILE(m.memline)
  1155.             =warning(a_c_scxdrv(1),m.memline)
  1156.             LOOP
  1157.           ENDIF
  1158.           FOR m.k = 1 TO a_scxdrvs(1)
  1159.             IF FULLPATH(a_scxdrv(m.k,1))==FULLPATH(m.memline)
  1160.               m.memline=''
  1161.               EXIT
  1162.             ENDIF
  1163.           ENDFOR
  1164.           IF EMPTY(m.memline)
  1165.             LOOP
  1166.           ENDIF
  1167.           a_scxdrvs(1)=a_scxdrvs(1)+1
  1168.           DIMENSION a_scxdrv(a_scxdrvs(1),8)
  1169.           a_scxdrv(a_scxdrvs(1),1)=FULLPATH(m.memline)
  1170.           LOOP
  1171.         ENDIF
  1172.       ENDDO
  1173.     ENDIF
  1174.     IF a_scxdrvs(1)>0
  1175.       m.drv_no=1
  1176.       FOR m.drv_cnt = 1 TO a_scxdrvs(1)
  1177.         IF ASCAN(a_drvoff,FULLPATH(a_scxdrv(m.drv_cnt,1)))>0
  1178.           LOOP
  1179.         ENDIF
  1180.         SCAN ALL FOR .NOT.DELETED()
  1181.           m.match_drv=.T.
  1182.           DO (a_scxdrv(m.drv_cnt,1))
  1183.           DO esc_check
  1184.         ENDSCAN
  1185.         LOCATE
  1186.         SCATTER MEMVAR MEMO
  1187.         DO restoreenv
  1188.       ENDFOR
  1189.     ENDIF
  1190.     m.insscxs=0
  1191.     m.at_line=ATCLINE('*:',SETUPCODE)
  1192.     IF m.at_line>0
  1193.       m.i=m.at_line-1
  1194.       DO WHILE m.i<MEMLINES(SETUPCODE)
  1195.         m.i=m.i+1
  1196.         m.memline=ALLTRIM(MLINE(SETUPCODE,m.i))
  1197.         IF m.i>m.at_line.AND..NOT.'*:'$m.memline
  1198.           m.at_pos=AT(m.cr,SETUPCODE,m.i)+1
  1199.           IF m.at_pos=1.OR.ATC('*:',SUBSTR(SETUPCODE,m.at_pos))=0
  1200.             EXIT
  1201.           ENDIF
  1202.           LOOP
  1203.         ENDIF
  1204.         FOR m.j = 2 TO 8
  1205.           m.at_pos=ATC(a_c_scxdrv(m.j),m.memline)
  1206.           IF m.at_pos=1
  1207.             m.memline=add_fext(ALLTRIM(SUBSTR(m.memline,m.at_pos+;
  1208.                       LEN(a_c_scxdrv(m.j)))))
  1209.             IF EMPTY(m.memline).OR..NOT.FILE(m.memline)
  1210.               =warning(a_c_scxdrv(m.j),m.memline)
  1211.               LOOP
  1212.             ENDIF
  1213.             FOR m.k = 1 TO a_scxdrvs(m.j)
  1214.               IF FULLPATH(a_scxdrv(m.k,m.j))==FULLPATH(m.memline)
  1215.                 m.memline=''
  1216.                 EXIT
  1217.               ENDIF
  1218.             ENDFOR
  1219.             IF EMPTY(m.memline)
  1220.               LOOP
  1221.             ENDIF
  1222.             a_scxdrvs(m.j)=a_scxdrvs(m.j)+1
  1223.             IF ALEN(a_scxdrv)<(8*a_scxdrvs(m.j))
  1224.               DIMENSION a_scxdrv(a_scxdrvs(m.j),8)
  1225.             ENDIF
  1226.             a_scxdrv(a_scxdrvs(m.j),m.j)=FULLPATH(m.memline)
  1227.             LOOP
  1228.           ENDIF
  1229.         ENDFOR
  1230.         FOR m.j = 1 TO 6
  1231.           m.at_pos=ATC(a_c_sprdrv(m.j),m.memline)
  1232.           IF m.at_pos=1
  1233.             m.memline=add_fext(ALLTRIM(SUBSTR(m.memline,m.at_pos+;
  1234.                       LEN(a_c_sprdrv(m.j)))))
  1235.             IF EMPTY(m.memline).OR..NOT.FILE(m.memline)
  1236.               =warning(a_c_sprdrv(m.j),m.memline)
  1237.               LOOP
  1238.             ENDIF
  1239.             FOR m.k = 1 TO a_sprdrvs(m.j)
  1240.               IF FULLPATH(a_sprdrv(m.k,m.j))==FULLPATH(m.memline)
  1241.                 m.memline=''
  1242.                 EXIT
  1243.               ENDIF
  1244.             ENDFOR
  1245.             IF EMPTY(m.memline)
  1246.               LOOP
  1247.             ENDIF
  1248.             a_sprdrvs(m.j)=a_sprdrvs(m.j)+1
  1249.             IF ALEN(a_sprdrv)<(8*a_sprdrvs(m.j))
  1250.               DIMENSION a_sprdrv(a_sprdrvs(m.j),8)
  1251.             ENDIF
  1252.             a_sprdrv(a_sprdrvs(m.j),m.j)=FULLPATH(m.memline)
  1253.             LOOP
  1254.           ENDIF
  1255.         ENDFOR
  1256.         m.at_pos=ATC(m.c_deflib,m.memline)
  1257.         IF m.at_pos=1
  1258.           m.memline=ALLTRIM(UPPER(SUBSTR(m.memline,m.at_pos+LEN(m.c_deflib))))
  1259.           IF EMPTY(m.memline)
  1260.             LOOP
  1261.           ENDIF
  1262.           m.lib_mode=.T.
  1263.           m.lib_name=m.memline
  1264.           REPLACE SETUPCODE WITH strtranc(SETUPCODE,m.c_deflib,m.m_deflib)
  1265.         ELSE
  1266.           m.at_pos=ATC(m.c_nogen,m.memline)
  1267.         ENDIF
  1268.         IF m.at_pos=1
  1269.           IF .NOT.m.gen_mode
  1270.             LOOP
  1271.           ENDIF
  1272.           m.gen_mode=.F.
  1273.           IF m.fromproj.AND..NOT.m.screenend
  1274.             REPLACE COMMENT WITH ''
  1275.             COPY MEMO COMMENT TO (m.fsprout)
  1276.           ELSE
  1277.             IF FILE(m.fsprout)
  1278.               ERASE (m.fsprout)
  1279.             ENDIF
  1280.           ENDIF
  1281.           IF FILE(m.fspxout)
  1282.             ERASE (m.fspxout)
  1283.           ENDIF
  1284.           IF FILE(m.fsprerr)
  1285.             ERASE (m.fsprerr)
  1286.           ENDIF
  1287.           LOOP
  1288.         ENDIF
  1289.         m.at_pos=ATC(m.c_inclib,m.memline)
  1290.         IF m.at_pos=1
  1291.           m.memline=CHRTRAN(UPPER(ALLTRIM(SUBSTR(m.memline,m.at_pos+;
  1292.                     LEN(m.c_inclib)))),m.badchars,m.stdascii)
  1293.           IF EMPTY(m.memline)
  1294.             LOOP
  1295.           ENDIF
  1296.           m.inclibs=m.inclibs+1
  1297.           DIMENSION a_inclib(m.inclibs)
  1298.           a_inclib(m.inclibs)=m.memline
  1299.           LOOP
  1300.         ENDIF
  1301.         m.at_pos=ATC(m.c_baslib,m.memline)
  1302.         IF m.at_pos=1
  1303.           m.memline=CHRTRAN(UPPER(ALLTRIM(SUBSTR(m.memline,m.at_pos+;
  1304.                     LEN(m.c_baslib)))),m.badchars,m.stdascii)
  1305.           IF EMPTY(m.memline)
  1306.             LOOP
  1307.           ENDIF
  1308.           m.baslibs=m.baslibs+1
  1309.           DIMENSION a_baslib(m.baslibs)
  1310.           a_baslib(m.baslibs)=m.memline
  1311.           IF ASCAN(a_inclib,m.memline)=0
  1312.             m.inclibs=m.inclibs+1
  1313.             DIMENSION a_inclib(m.inclibs)
  1314.             a_inclib(m.inclibs)=m.memline
  1315.           ENDIF
  1316.           LOOP
  1317.         ENDIF
  1318.         m.at_pos=ATC(m.c_nowclaus,m.memline)
  1319.         IF m.at_pos=1
  1320.           m.memline=ALLTRIM(SUBSTR(m.memline,m.at_pos+LEN(m.c_nowclaus)))
  1321.           IF EMPTY(m.memline)
  1322.             LOOP
  1323.           ENDIF
  1324.           m.str_data=LEFT(m.platform_,1)
  1325.           DO CASE
  1326.             CASE m.str_data=='D'
  1327.               m.j=1
  1328.             CASE m.str_data=='W'
  1329.               m.j=2
  1330.             CASE m.str_data=='M'
  1331.               m.j=3
  1332.             OTHERWISE
  1333.               m.j=4
  1334.           ENDCASE
  1335.           IF EMPTY(m.name)
  1336.             m.name=SYS(2015)
  1337.           ENDIF
  1338.           m.name=PADR(m.name,10)+m.str_data
  1339.           REPLACE NAME WITH m.name
  1340.           a_nowclaus(m.scxcount,m.j)=m.name+ALLTRIM(m.memline)
  1341.           m.updsprflag=.T.
  1342.           LOOP
  1343.         ENDIF
  1344.         m.at_pos=ATC(m.c_memvar,m.memline)
  1345.         IF m.at_pos=1
  1346.           m.memvarmode=.T.
  1347.           LOOP
  1348.         ENDIF
  1349.         IF TYPE('PLATFORM')=='C'
  1350.           m.at_pos=ATC(m.c_name,m.memline)
  1351.           IF m.at_pos=1
  1352.             m.name_mode=.T.
  1353.             LOOP
  1354.           ENDIF
  1355.         ENDIF
  1356.         IF .NOT.m.platform_==m.cplatform_.AND..NOT.m.platform_==m.splatform_
  1357.           LOOP
  1358.         ENDIF
  1359.         m.at_pos=ATC(m.c_noxgen,m.memline)
  1360.         IF m.at_pos=1
  1361.           m.xgen_mode=.F.
  1362.           EXIT
  1363.         ENDIF
  1364.         m.at_pos=ATC(m.c_pjxset,m.memline)
  1365.         IF m.at_pos=1
  1366.           m.pjxset=.T.
  1367.           LOOP
  1368.         ENDIF
  1369.         m.at_pos=ATC(m.c_set,m.memline)
  1370.         IF m.at_pos=1
  1371.           IF m.pjxset.AND.m.fromproj
  1372.             LOOP
  1373.           ENDIF
  1374.           m.memline=ALLTRIM(STRTRAN(SUBSTR(m.memline,m.at_pos+;
  1375.                     LEN(m.c_set)),CHR(9),' '))
  1376.           m.at_pos=AT(' ',m.memline)
  1377.           IF m.at_pos=0
  1378.             LOOP
  1379.           ENDIF
  1380.           m.field_name='PJXDATA.'+ALLTRIM(UPPER(LEFT(m.memline,m.at_pos)))
  1381.           IF TYPE(m.field_name)=='U'
  1382.             m.field_name=STRTRAN(STRTRAN(m.field_name,'BORDERGETS','NOLOGO'),;
  1383.                          'PLATONLY','SAVECODE')
  1384.             IF TYPE(m.field_name)=='U'
  1385.               LOOP
  1386.             ENDIF
  1387.           ENDIF
  1388.           m.memline=ALLTRIM(UPPER(SUBSTR(m.memline,m.at_pos)))
  1389.           DO CASE
  1390.             CASE EMPTY(m.memline)
  1391.               LOOP
  1392.             CASE ATC('ASSOCWINDS',m.field_name)>0
  1393.               m.at_pos=AT(' ',m.memline)
  1394.               IF m.at_pos=0
  1395.                 LOOP
  1396.               ENDIF
  1397.               IF .NOT.ALLTRIM(UPPER(LEFT(m.memline,m.at_pos)))=='TO'
  1398.                 LOOP
  1399.               ENDIF
  1400.               m.memline=ALLTRIM(SUBSTR(m.memline,m.at_pos))
  1401.               m.set_mode=STRTRAN(m.memline,',',CHR(13))+CHR(13)
  1402.             CASE m.memline=='ON'
  1403.               m.set_mode=.T.
  1404.             CASE m.memline=='OFF'
  1405.               m.set_mode=.F.
  1406.             OTHERWISE
  1407.               LOOP
  1408.           ENDCASE
  1409.           GOTO m.recno IN PJXDATA
  1410.           IF TYPE(m.field_name)=='M'
  1411.             REPLACE (m.field_name) WITH EVALUATE(m.field_name)+m.set_mode,;
  1412.                     PJXDATA.MODAL WITH .T.
  1413.           ELSE
  1414.             REPLACE (m.field_name) WITH m.set_mode
  1415.             IF ATC('SAVECODE',m.field_name)>0
  1416.               m.allplatforms=.NOT.EVALUATE(m.field_name)
  1417.             ENDIF
  1418.           ENDIF
  1419.           LOOP
  1420.         ENDIF
  1421.         m.at_pos=ATC(m.c_prg,m.memline)
  1422.         IF m.at_pos=1
  1423.           IF m.pjxset.AND.m.fromproj
  1424.             LOOP
  1425.           ENDIF
  1426.           m.at_pos=AT('.',m.fsprout)
  1427.           REPLACE SETUPCODE WITH '#NOREAD PLAIN'+m.cr_lf+SETUPCODE
  1428.           m.i=m.i+1
  1429.           m.memline=m.c_outfile+' '+IIF(m.at_pos=0,m.fsprout,;
  1430.                     LEFT(m.fsprout,m.at_pos-1))+'.PRG'
  1431.         ENDIF
  1432.         m.at_pos=ATC(m.c_outfile,m.memline)
  1433.         IF m.at_pos=1
  1434.           IF m.fromproj
  1435.             LOOP
  1436.           ENDIF
  1437.           m.memline=ALLTRIM(SUBSTR(m.memline,m.at_pos+LEN(m.c_outfile)))
  1438.           m.at_pos=AT('.',m.memline)
  1439.           IF EMPTY(m.memline).OR.m.at_pos=0.OR.m.at_pos=LEN(m.memline)
  1440.             LOOP
  1441.           ENDIF
  1442.           GOTO m.recno IN PJXDATA
  1443.           IF ':'$m.memline.OR.'\'$m.memline
  1444.             m.fsprout=m.memline
  1445.           ELSE
  1446.             m.fsprout=FULLPATH(m.memline,m.fscxbase)
  1447.           ENDIF
  1448.           m.file_ext=UPPER(RIGHT(m.fsprout,4))
  1449.           DO CASE
  1450.             CASE m.file_ext=='.SPR'
  1451.               m.file_ext='.SPX'
  1452.             CASE m.file_ext=='.MPR'
  1453.               m.file_ext='.MPX'
  1454.             OTHERWISE
  1455.               m.file_ext='.FXP'
  1456.           ENDCASE
  1457.           m.fspxout=trimext(m.fsprout)+m.file_ext
  1458.           m.fsprerr=trimext(m.fsprout)+'.ERR'
  1459.           REPLACE PJXDATA.OUTFILE WITH m.fsprout+m.null
  1460.           m.winrelease=trimpath(m.fsprerr)
  1461.           IF WEXIST(m.winrelease)
  1462.             RELEASE WINDOW (m.winrelease)
  1463.           ENDIF
  1464.           IF FILE(m.fsprerr)
  1465.             ERASE (m.fsprerr)
  1466.           ENDIF
  1467.           IF FILE(m.fspxout)
  1468.             ERASE (m.fspxout)
  1469.           ENDIF
  1470.           m.winrelease=trimpath(m.fsprout)
  1471.           IF WEXIST(m.winrelease)
  1472.             RELEASE WINDOW (m.winrelease)
  1473.           ENDIF
  1474.           IF FILE(m.fsprout)
  1475.             ERASE (m.fsprout)
  1476.           ENDIF
  1477.           LOOP
  1478.         ENDIF
  1479.         m.at_pos=ATC(m.c_compspr,m.memline)
  1480.         IF m.at_pos=1
  1481.           m.compspr='ON'
  1482.           LOOP
  1483.         ENDIF
  1484.         m.at_pos=ATC(m.c_nocompspr,m.memline)
  1485.         IF m.at_pos=1
  1486.           m.compspr='OFF'
  1487.           LOOP
  1488.         ENDIF
  1489.         m.at_pos=ATC(m.c_dispspr,m.memline)
  1490.         IF m.at_pos=1
  1491.           m.dispspr='ON'
  1492.           LOOP
  1493.         ENDIF
  1494.         m.at_pos=ATC(m.c_nodispspr,m.memline)
  1495.         IF m.at_pos=1
  1496.           m.dispspr='OFF'
  1497.           LOOP
  1498.         ENDIF
  1499.         m.at_pos=ATC(m.c_autorun,m.memline)
  1500.         IF m.at_pos=1
  1501.           m.autorun='ON'
  1502.           LOOP
  1503.         ENDIF
  1504.         m.at_pos=ATC(m.c_noautorun,m.memline)
  1505.         IF m.at_pos=1
  1506.           m.autorun='OFF'
  1507.           LOOP
  1508.         ENDIF
  1509.         m.at_pos=ATC(m.c_scnobj,m.memline)
  1510.         IF m.at_pos=1
  1511.           m.scnobj='ON'
  1512.           LOOP
  1513.         ENDIF
  1514.         m.at_pos=ATC(m.c_noscnobj,m.memline)
  1515.         IF m.at_pos=1
  1516.           m.scnobj='OFF'
  1517.           LOOP
  1518.         ENDIF
  1519.         m.at_pos=ATC(m.c_braces,m.memline)
  1520.         IF m.at_pos=1
  1521.           m.braces='ON'
  1522.           LOOP
  1523.         ENDIF
  1524.         m.at_pos=ATC(m.c_nobraces,m.memline)
  1525.         IF m.at_pos=1
  1526.           m.braces='OFF'
  1527.           LOOP
  1528.         ENDIF
  1529.         m.at_pos=ATC(m.c_ignrbrcs,m.memline)
  1530.         IF m.at_pos=1
  1531.           m.ignrbraces=.T.
  1532.           LOOP
  1533.         ENDIF
  1534.         m.at_pos=ATC(m.c_genscrnx,m.memline)
  1535.         IF m.at_pos=1
  1536.           m.memline=ALLTRIM(SUBSTR(m.memline,m.at_pos+LEN(m.c_genscrnx)))
  1537.           IF EMPTY(m.memline)
  1538.             LOOP
  1539.           ENDIF
  1540.           IF ':'$m.memline.OR.'\'$m.memline
  1541.             m.genscrn=m.memline
  1542.           ELSE
  1543.             m.genscrn=FULLPATH(m.memline,SYS(2004))
  1544.           ENDIF
  1545.           IF .NOT.'.'$RIGHT(m.genscrn,4)
  1546.             m.genscrn=m.genscrn+'.PRG'
  1547.           ENDIF
  1548.           LOOP
  1549.         ENDIF
  1550.       ENDDO
  1551.     ENDIF
  1552.     IF .NOT.m.xgen_mode
  1553.       EXIT
  1554.     ENDIF
  1555.     SELECT SCXDATA
  1556.     LOCATE
  1557.     IF EMPTY(m.msg1)
  1558.       m.comp_flag=.T.
  1559.       m.str_data=LOWER(IIF(':'$m.fscxbase,m.fscxbase,FULLPATH(m.fscxbase)))
  1560.       DO CASE
  1561.         CASE m.gen_mode
  1562.           IF _WINDOWS.OR._MAC
  1563.             SET MESSAGE TO LEFT('Generating Screen Database: '+m.str_data,79)
  1564.           ENDIF
  1565.           m.msg1='Generating Screen Database...'
  1566.         CASE m.lib_mode
  1567.           IF _WINDOWS.OR._MAC
  1568.             SET MESSAGE TO LEFT('Updating Library Database: '+m.str_data,79)
  1569.           ENDIF
  1570.           m.msg1='Updating Library Database...'
  1571.         OTHERWISE
  1572.           IF _WINDOWS.OR._MAC
  1573.             SET MESSAGE TO LEFT('Scanning Screen Database: '+m.str_data,79)
  1574.           ENDIF
  1575.           m.msg1='Scanning Screen Database...'
  1576.       ENDCASE
  1577.       m.msg2=IIF(m.gen_mode,'['+ALLTRIM(m.platform_)+']','')
  1578.       DO delaybar WITH m.msg1,m.msg2,.1
  1579.     ELSE
  1580.       m.msg2=IIF(m.gen_mode,'['+ALLTRIM(m.platform_)+']','')
  1581.     ENDIF
  1582.     DO esc_check
  1583.     GOTO m.recno IN PJXDATA
  1584.     IF .NOT.openfoxscx()
  1585.       EXIT
  1586.     ENDIF
  1587.     SELECT FOXSCX
  1588.     IF TYPE('PLATFORM')=='C'
  1589.       SET FILTER TO PLATFORM==m.platform_
  1590.     ELSE
  1591.       SET FILTER TO
  1592.     ENDIF
  1593.     SET ORDER TO OBJSCX_
  1594.     LOCATE
  1595.     m.scx_name=PADR(m.scx_name,LEN(OBJSCX_))
  1596.     m.lib_name=PADR(m.lib_name,LEN(OBJLIB_))
  1597.     SEEK m.scx_name+m.lib_name
  1598.     REPLACE REST OBJFLAG_ WITH .F.;
  1599.             WHILE OBJSCX_==m.scx_name.AND.OBJLIB_==m.lib_name
  1600.     LOCATE
  1601.     SELECT SCXDATA
  1602.     LOCATE
  1603.     m.setupcd=SETUPCODE
  1604.     REPLACE SETUPCODE WITH evltxt(m.setupcd)
  1605.     m.setupcd=''
  1606.     IF ATC(m.c_defobj,SETUPCODE)>0.OR.ATC(m.c_basobj,SETUPCODE)>0
  1607.       REPLACE COMMENT WITH SETUPCODE
  1608.     ENDIF
  1609.     SCATTER MEMVAR MEMO
  1610.     m.lastfilter=FILTER()
  1611.     m.lib_upd=.F.
  1612.     m.loop_flag=.F.
  1613.     m.loop_def=.F.
  1614.     DO delaybar WITH '','',5
  1615.     DO WHILE .T.
  1616.       DO esc_check
  1617.       m.loop_obj=.F.
  1618.       SCAN ALL FOR .NOT.DELETED()
  1619.         IF wordsearch(m.c_delete)==m.null
  1620.           LOOP
  1621.         ENDIF
  1622.         =delrec()
  1623.         REPLACE COMMENT WITH strtranc(COMMENT,m.c_delete,m.m_delete)
  1624.       ENDSCAN
  1625.       IF .NOT.m.ignrbraces.AND..NOT.m.lib_mode
  1626.         SCAN ALL FOR .NOT.DELETED()
  1627.           DO CASE
  1628.             CASE m.braces=='ON'
  1629.               =evlrec()
  1630.             CASE OBJTYPE#1.AND..NOT.wordsearch(m.c_evltxt)==m.null
  1631.               =evlrec()
  1632.             CASE OBJTYPE=1.AND..NOT.wordsearch(m.c_evltxt,.T.)==m.null
  1633.               =evlrec()
  1634.           ENDCASE
  1635.         ENDSCAN
  1636.       ENDIF
  1637.       IF m.r_scxdata>RECCOUNT()
  1638.         EXIT
  1639.       ENDIF
  1640.       GOTO m.r_scxdata
  1641.       m.match_drv=.F.
  1642.       IF m.gen_mode.AND..NOT.m.loop_flag.AND.a_scxdrvs(2)>0
  1643.         m.drv_no=2
  1644.         FOR m.drv_cnt = 1 TO a_scxdrvs(2)
  1645.           IF ASCAN(a_drvoff,FULLPATH(a_scxdrv(m.drv_cnt,2)))>0
  1646.             LOOP
  1647.           ENDIF
  1648.           m.msg3='['+ALLTRIM(m.platform_)+'] '+trimpath(a_scxdrv(m.drv_cnt,2),.F.,.T.)
  1649.           DO delaybar WITH '',m.msg3,90*m.drv_cnt/a_scxdrvs(2)+5
  1650.           SCAN ALL FOR .NOT.DELETED()
  1651.             m.match_drv=.T.
  1652.             DO (a_scxdrv(m.drv_cnt,2))
  1653.             DO esc_check
  1654.           ENDSCAN
  1655.           LOCATE
  1656.           SCATTER MEMVAR MEMO
  1657.           DO restoreenv
  1658.         ENDFOR
  1659.       ENDIF
  1660.       IF m.match_drv
  1661.         DO delaybar WITH '',m.msg2,5
  1662.       ENDIF
  1663.       m.match_drv=.F.
  1664.       IF m.gen_mode.AND.a_scxdrvs(3)>0
  1665.         m.drv_no=3
  1666.         FOR m.drv_cnt = 1 TO a_scxdrvs(3)
  1667.           IF ASCAN(a_drvoff,FULLPATH(a_scxdrv(m.drv_cnt,3)))>0
  1668.             LOOP
  1669.           ENDIF
  1670.           m.msg3='['+ALLTRIM(m.platform_)+'] '+trimpath(a_scxdrv(m.drv_cnt,3),.F.,.T.)
  1671.           DO delaybar WITH '',m.msg3,90*m.drv_cnt/a_scxdrvs(3)+5
  1672.           SCAN ALL FOR .NOT.DELETED()
  1673.             m.match_drv=.T.
  1674.             DO (a_scxdrv(m.drv_cnt,3))
  1675.             DO esc_check
  1676.           ENDSCAN
  1677.           LOCATE
  1678.           SCATTER MEMVAR MEMO
  1679.           DO restoreenv
  1680.         ENDFOR
  1681.       ENDIF
  1682.       IF m.match_drv
  1683.         DO delaybar WITH '',m.msg2,5
  1684.       ENDIF
  1685.       IF m.r_scxdata>RECCOUNT()
  1686.         EXIT
  1687.       ENDIF
  1688.       LOCATE
  1689.       m.obj_name=SPACE(LEN(FOXSCX.OBJNAME_))
  1690.       m.obj_base=SPACE(LEN(FOXSCX.OBJBASE_))
  1691.       m.obj_field=SPACE(LEN(FOXSCX.OBJFIELD_))
  1692.       m.obj_lib=SPACE(LEN(FOXSCX.OBJLIB_))
  1693.       SCAN ALL FOR .NOT.DELETED()
  1694.         m.obj_name=SPACE(LEN(FOXSCX.OBJNAME_))
  1695.         m.obj_base=SPACE(LEN(FOXSCX.OBJBASE_))
  1696.         m.obj_field=SPACE(LEN(FOXSCX.OBJFIELD_))
  1697.         m.obj_lib=SPACE(LEN(FOXSCX.OBJLIB_))
  1698.         IF m.memvarmode.AND.OBJTYPE#1
  1699.           m.old_text=ALLTRIM(MLINE(NAME,1))
  1700.           m.at_pos=AT('.',m.old_text)
  1701.           m.new_text='m'+SUBSTR(m.old_text,m.at_pos)
  1702.           IF m.at_pos>0.AND.(m.at_pos#2.OR.;
  1703.              .NOT.UPPER(LEFT(m.old_text,2))=='M.').AND.;
  1704.              .NOT.m.old_text==m.new_text
  1705.             REPLACE NAME WITH m.new_text,;
  1706.                     WHEN WITH strtranc(WHEN,m.old_text,m.new_text),;
  1707.                     VALID WITH strtranc(VALID,m.old_text,m.new_text),;
  1708.                     MESSAGE WITH strtranc(MESSAGE,m.old_text,m.new_text),;
  1709.                     ERROR WITH strtranc(ERROR,m.old_text,m.new_text),;
  1710.                     RANGELO WITH strtranc(RANGELO,m.old_text,m.new_text),;
  1711.                     RANGEHI WITH strtranc(RANGEHI,m.old_text,m.new_text)
  1712.           ENDIF
  1713.         ENDIF
  1714.         IF m.lib_mode.AND..NOT.m.loop_flag.AND.ATC(m.c_defobj,COMMENT)>0
  1715.           m.at_line=ATCLINE(m.c_defobj,COMMENT)
  1716.           IF m.at_line>0
  1717.             FOR m.i = m.at_line TO MEMLINES(COMMENT)
  1718.               m.memline=ALLTRIM(MLINE(COMMENT,m.i))
  1719.               IF m.i>m.at_line.AND..NOT.'*:'$m.memline
  1720.                 m.at_pos=AT(m.cr,COMMENT,m.i)+1
  1721.                 IF m.at_pos=1.OR.ATC(m.c_defobj,SUBSTR(COMMENT,m.at_pos))=0
  1722.                   EXIT
  1723.                 ENDIF
  1724.                 LOOP
  1725.               ENDIF
  1726.               m.at_pos=ATC(m.c_defobj,m.memline)
  1727.               IF m.at_pos=1
  1728.                 m.obj_name=PADR(CHRTRAN(ALLTRIM(SUBSTR(m.memline,m.at_pos+;
  1729.                            LEN(m.c_defobj))),m.badchars,m.stdascii),;
  1730.                            LEN(FOXSCX.OBJNAME_))
  1731.                 EXIT
  1732.               ENDIF
  1733.             ENDFOR
  1734.           ENDIF
  1735.         ENDIF
  1736.         m.at_line=ATCLINE(m.c_basobj,COMMENT)
  1737.         IF m.at_line>0
  1738.           FOR m.i = m.at_line TO MEMLINES(COMMENT)
  1739.             m.memline=ALLTRIM(MLINE(COMMENT,m.i))
  1740.             IF m.i>m.at_line.AND..NOT.'*:'$m.memline
  1741.               m.at_pos=AT(m.cr,COMMENT,m.i)+1
  1742.               IF m.at_pos=1.OR.ATC(m.c_basobj,SUBSTR(COMMENT,m.at_pos))=0
  1743.                 EXIT
  1744.               ENDIF
  1745.               LOOP
  1746.             ENDIF
  1747.             m.at_pos=ATC(m.c_basobj,m.memline)
  1748.             IF m.at_pos=1
  1749.               m.obj_base=PADR(ALLTRIM(SUBSTR(m.memline,m.at_pos+;
  1750.                          LEN(m.c_basobj))),LEN(FOXSCX.OBJBASE_))
  1751.               EXIT
  1752.             ENDIF
  1753.           ENDFOR
  1754.         ENDIF
  1755.         IF OBJTYPE>=11
  1756.           m.obj_field=MLINE(NAME,1)
  1757.           m.obj_field=PADR(ALLTRIM(UPPER(SUBSTR(m.obj_field,AT('.',;
  1758.                       m.obj_field)+1))),LEN(FOXSCX.OBJFIELD_))
  1759.           IF m.baslibs>0.AND..NOT.EMPTY(m.obj_field)
  1760.             m.r=RECNO()
  1761.             SELECT FOXSCX
  1762.             SET ORDER TO OBJFIELD_
  1763.             m.lastexac=SET('EXACT')
  1764.             SET EXACT ON
  1765.             FOR m.i = 1 TO m.baslibs
  1766.               SEEK PADR(m.obj_field,LEN(OBJFIELD_))+;
  1767.                    PADR(a_baslib(m.i),LEN(OBJLIB_))
  1768.               IF .NOT.EOF()
  1769.                 m.obj_base=OBJNAME_
  1770.                 m.obj_lib=OBJLIB_
  1771.                 EXIT
  1772.               ENDIF
  1773.             ENDFOR
  1774.             IF m.lastexac=='ON'
  1775.               SET EXACT ON
  1776.             ELSE
  1777.               SET EXACT OFF
  1778.             ENDIF
  1779.             SELECT SCXDATA
  1780.             GOTO m.r
  1781.             IF EMPTY(m.obj_base).OR.ATC(m.m_basobj,COMMENT)>0.OR.;
  1782.                EMPTY(wordsearch(m.c_basobj))
  1783.               LOOP
  1784.             ENDIF
  1785.             REPLACE COMMENT WITH m.c_basobj+' '+m.obj_base+m.cr_lf+COMMENT
  1786.           ENDIF
  1787.         ENDIF
  1788.         IF .NOT.m.lib_mode.OR.EMPTY(m.obj_name)
  1789.           LOOP
  1790.         ENDIF
  1791.         m.lib_upd=.T.
  1792.         m.i=m.r_scxdata-2
  1793.         m.msg3='['+ALLTRIM(m.platform_)+'] '+ALLTRIM(m.lib_name)+'.'+;
  1794.                m.obj_name
  1795.         DO delaybar WITH '',m.msg3,90*(RECNO()-m.i)/m.rec_total+5
  1796.         IF ATC(m.c_defobj,SETUPCODE)>0
  1797.           REPLACE SETUPCODE WITH strtranc(SETUPCODE,m.c_defobj,m.m_defobj)
  1798.         ENDIF
  1799.         REPLACE COMMENT WITH strtranc(COMMENT,m.c_defobj,m.m_defobj)
  1800.         DIMENSION a_fields(1)
  1801.         =AFIELDS(a_fields)
  1802.         RELEASE a_scatter
  1803.         SCATTER TO a_scatter MEMO
  1804.         SELECT FOXSCX
  1805.         SET ORDER TO OBJNAME_
  1806.         SEEK UPPER(m.obj_name+m.lib_name)
  1807.         IF EOF()
  1808.           INSERT BLANK
  1809.         ENDIF
  1810.         IF ALEN(a_scatter)=(FCOUNT()-m.fcountadj)
  1811.           GATHER FROM a_scatter MEMO
  1812.         ELSE
  1813.           m.lastexac=SET('EXACT')
  1814.           SET EXACT ON
  1815.           FOR m.i = 1 TO (FCOUNT()-m.fcountadj)
  1816.             m.j=ASCAN(a_fields,FIELD(m.i))
  1817.             IF m.j=0
  1818.               LOOP
  1819.             ENDIF
  1820.             REPLACE (FIELD(m.i)) WITH a_scatter(INT(m.j/4)+1)
  1821.           ENDFOR
  1822.           IF m.lastexac=='ON'
  1823.             SET EXACT ON
  1824.           ELSE
  1825.             SET EXACT OFF
  1826.           ENDIF
  1827.         ENDIF
  1828.         REPLACE PLATFORM WITH m.platform_, OBJNAME_ WITH m.obj_name,;
  1829.                 OBJBASE_ WITH m.obj_base, OBJFIELD_ WITH m.obj_field,;
  1830.                 OBJLIB_ WITH m.lib_name, OBJSCX_ WITH m.scx_name,;
  1831.                 OBJFLAG_ WITH .T.
  1832.         SELECT SCXDATA
  1833.       ENDSCAN
  1834.       SELECT SCXDATA
  1835.       IF m.r_scxdata>RECCOUNT()
  1836.         EXIT
  1837.       ENDIF
  1838.       GOTO m.r_scxdata
  1839.       IF .NOT.m.gen_mode
  1840.         EXIT
  1841.       ENDIF
  1842.       IF m.lib_upd.AND..NOT.m.loop_def
  1843.         DO delaybar WITH '',m.msg2,5
  1844.       ENDIF
  1845.       m.loop_def=.T.
  1846.       GOTO m.r_scxdata
  1847.       SCAN REST FOR .NOT.DELETED()
  1848.         m.at_pos=ATC(m.c_trntxt,COMMENT)
  1849.         IF m.at_pos=0
  1850.           LOOP
  1851.         ENDIF
  1852.         m.str_data=SUBSTR(COMMENT,m.at_pos)
  1853.         FOR m.i = 1 TO MEMLINES(m.str_data)
  1854.           m.memline=ALLTRIM(MLINE(m.str_data,m.i))
  1855.           m.at_pos=ATC(m.c_trntxt,m.memline)
  1856.           IF m.at_pos=1
  1857.             m.at_pos=AT('||',m.memline)
  1858.             IF m.at_pos=0
  1859.               LOOP
  1860.             ENDIF
  1861.             m.old_text=ALLTRIM(SUBSTR(m.memline,LEN(m.c_trntxt)+1,m.at_pos-;
  1862.                        LEN(m.c_trntxt)-1))
  1863.             IF LEN(m.old_text)=0
  1864.               LOOP
  1865.             ENDIF
  1866.             m.old_text=STRTRAN(STRTRAN(STRTRAN(STRTRAN(m.old_text,'\\',;
  1867.                        '\'),'\t',CHR(9)),'\n',CHR(10)),'\r',CHR(13))
  1868.             m.at_pos2=AT('||',m.memline,2)
  1869.             m.new_text=ALLTRIM(SUBSTR(m.memline,m.at_pos+2,;
  1870.                        IIF(m.at_pos2=0,LEN(m.memline),m.at_pos2-m.at_pos-2)))
  1871.             m.new_text=STRTRAN(STRTRAN(STRTRAN(STRTRAN(m.new_text,'\\',;
  1872.                        '\'),'\t',CHR(9)),'\n',CHR(10)),'\r',CHR(13))
  1873.             m.match_pos=.F.
  1874.             m.match_no=.F.
  1875.             IF m.at_pos2>0
  1876.               m.at_pos=AT('||',m.memline,3)
  1877.               m.match_pos=VAL(SUBSTR(m.memline,m.at_pos2+2,;
  1878.                           IIF(m.at_pos=0,LEN(m.memline),m.at_pos-m.at_pos2-2)))
  1879.               IF m.at_pos>0
  1880.                 m.match_no=VAL(SUBSTR(m.memline,m.at_pos+2))
  1881.               ENDIF
  1882.             ENDIF
  1883.             FOR m.j = 1 TO FCOUNT()
  1884.               m.field_name=FIELD(m.j)
  1885.               IF TYPE(m.field_name)#'M'
  1886.                 LOOP
  1887.               ENDIF
  1888.               m.field_eval=EVALUATE(m.field_name)
  1889.               IF m.field_name=='COMMENT'
  1890.                 m.at_pos=OCCURS('||',m.field_eval)
  1891.                 IF m.at_pos>0
  1892.                   m.at_pos=AT('||',m.field_eval,m.at_pos)
  1893.                   IF m.at_pos>0
  1894.                     REPLACE (m.field_name) WITH LEFT(m.field_eval,m.at_pos-1)+;
  1895.                             strtranc(SUBSTR(m.field_eval,m.at_pos),m.old_text,;
  1896.                             m.new_text,m.match_pos,m.match_no)
  1897.                   ENDIF
  1898.                 ENDIF
  1899.                 LOOP
  1900.               ENDIF
  1901.               IF ATC(m.old_text,m.field_eval)>0
  1902.                 REPLACE (m.field_name) WITH strtranc(m.field_eval,m.old_text,;
  1903.                                             m.new_text,m.match_pos,m.match_no)
  1904.               ENDIF
  1905.             ENDFOR
  1906.             IF .NOT.m.ignrbraces.AND.m.braces=='ON'
  1907.               =evlrec()
  1908.             ENDIF
  1909.           ENDIF
  1910.         ENDFOR
  1911.       ENDSCAN
  1912.       IF m.r_scxdata>RECCOUNT()
  1913.         EXIT
  1914.       ENDIF
  1915.       GOTO m.r_scxdata
  1916.       SCAN REST FOR .NOT.DELETED()
  1917.         m.at_line=ATCLINE(m.c_if,COMMENT)
  1918.         IF m.at_line=0
  1919.           LOOP
  1920.         ENDIF
  1921.         FOR m.i = m.at_line TO MEMLINES(COMMENT)
  1922.           m.memline=ALLTRIM(MLINE(COMMENT,m.i))
  1923.           IF m.i>m.at_line.AND..NOT.'*:'$m.memline
  1924.             m.at_pos=AT(m.cr,COMMENT,m.i)+1
  1925.             IF m.at_pos=1.OR.ATC(m.c_if,SUBSTR(COMMENT,m.at_pos))=0
  1926.               EXIT
  1927.             ENDIF
  1928.             LOOP
  1929.           ENDIF
  1930.           m.at_pos=ATC(m.c_if,m.memline)
  1931.           IF m.at_pos=1
  1932.             m.obj_expr=ALLTRIM(SUBSTR(m.memline,m.at_pos+LEN(m.c_if)))
  1933.             IF EMPTY(m.obj_expr)
  1934.               LOOP
  1935.             ENDIF
  1936.             =insif2(m.obj_expr)
  1937.             REPLACE COMMENT WITH strtranc(COMMENT,m.c_if,m.m_if)
  1938.             EXIT
  1939.           ENDIF
  1940.         ENDFOR
  1941.       ENDSCAN
  1942.       IF m.r_scxdata>RECCOUNT()
  1943.         EXIT
  1944.       ENDIF
  1945.       GOTO m.r_scxdata
  1946.       SCAN REST FOR .NOT.DELETED()
  1947.         m.at_line=ATCLINE(m.c_insobj,COMMENT)
  1948.         IF m.at_line=0
  1949.           LOOP
  1950.         ENDIF
  1951.         FOR m.i = MEMLINES(COMMENT) TO m.at_line STEP -1
  1952.           =esc_check()
  1953.           m.memline=ALLTRIM(UPPER(MLINE(COMMENT,m.i)))
  1954.           m.at_pos=ATC(m.c_insobj,m.memline)
  1955.           IF m.at_pos=1
  1956.             m.obj_lib=''
  1957.             m.obj_name=PADR(ALLTRIM(SUBSTR(m.memline,m.at_pos+;
  1958.                        LEN(m.c_insobj))),LEN(FOXSCX.OBJNAME_))
  1959.             m.at_pos=AT('.',m.obj_name)
  1960.             IF m.at_pos>0
  1961.               m.obj_lib=PADR(UPPER(CHRTRAN(ALLTRIM(LEFT(m.obj_name,m.at_pos-1)),;
  1962.                         m.badchars,m.stdascii)),LEN(FOXSCX.OBJLIB_))
  1963.               m.obj_name=ALLTRIM(SUBSTR(m.obj_name,m.at_pos+1))
  1964.             ENDIF
  1965.             m.obj_name=PADR(CHRTRAN(m.obj_name,m.badchars,m.stdascii),;
  1966.                        LEN(FOXSCX.OBJNAME_))
  1967.             IF m.inclibs>0.AND.EMPTY(m.obj_lib)
  1968.               SELECT FOXSCX
  1969.               SET ORDER TO OBJNAME_
  1970.               m.lastexac=SET('EXACT')
  1971.               SET EXACT ON
  1972.               FOR m.j = 1 TO m.inclibs
  1973.                 SEEK UPPER(PADR(m.obj_name,LEN(OBJNAME_))+;
  1974.                      PADR(a_inclib(m.j),LEN(OBJLIB_)))
  1975.                 IF .NOT.EOF()
  1976.                   m.obj_lib=OBJLIB_
  1977.                   EXIT
  1978.                 ENDIF
  1979.               ENDFOR
  1980.               IF m.lastexac=='ON'
  1981.                 SET EXACT ON
  1982.               ELSE
  1983.                 SET EXACT OFF
  1984.               ENDIF
  1985.               SELECT SCXDATA
  1986.             ENDIF
  1987.             IF insobj(ALLTRIM(m.obj_lib)+'.'+ALLTRIM(m.obj_name))
  1988.               m.loop_obj=.T.
  1989.             ENDIF
  1990.           ENDIF
  1991.         ENDFOR
  1992.       ENDSCAN
  1993.       IF m.r_scxdata>RECCOUNT()
  1994.         EXIT
  1995.       ENDIF
  1996.       GOTO m.r_scxdata
  1997.       SCAN REST FOR .NOT.DELETED()
  1998.         m.at_line=ATCLINE(m.c_insscx,COMMENT)
  1999.         IF m.at_line=0
  2000.           LOOP
  2001.         ENDIF
  2002.         FOR m.i = MEMLINES(COMMENT) TO m.at_line STEP -1
  2003.           =esc_check()
  2004.           m.memline=ALLTRIM(MLINE(COMMENT,m.i))
  2005.           m.at_pos=ATC(m.c_insscx,m.memline)
  2006.           IF m.at_pos=1
  2007.             m.scx_file=ALLTRIM(SUBSTR(m.memline,m.at_pos+LEN(m.c_insscx)))
  2008.             DO CASE
  2009.               CASE m.insscxs>=256
  2010.                 =delrec()
  2011.               CASE insscx(m.scx_file)>0
  2012.                 m.loop_obj=.T.
  2013.                 m.insscxs=m.insscxs+1
  2014.               OTHERWISE
  2015.                 m.memline=m.scx_file
  2016.                 IF .NOT.'.'$m.memline
  2017.                   m.memline=m.memline+'.SCX'
  2018.                 ENDIF
  2019.             ENDCASE
  2020.           ENDIF
  2021.         ENDFOR
  2022.       ENDSCAN
  2023.       m.match_drv=.F.
  2024.       IF m.gen_mode.AND.a_scxdrvs(4)>0
  2025.         m.drv_no=4
  2026.         FOR m.drv_cnt = 1 TO a_scxdrvs(4)
  2027.           IF ASCAN(a_drvoff,FULLPATH(a_scxdrv(m.drv_cnt,4)))>0
  2028.             LOOP
  2029.           ENDIF
  2030.           m.msg3='['+ALLTRIM(m.platform_)+'] '+trimpath(a_scxdrv(m.drv_cnt,4),.F.,.T.)
  2031.           DO delaybar WITH '',m.msg3,90*m.drv_cnt/a_scxdrvs(4)+5
  2032.           SCAN ALL FOR .NOT.DELETED()
  2033.             m.match_drv=.T.
  2034.             DO (a_scxdrv(m.drv_cnt,4))
  2035.             DO esc_check
  2036.           ENDSCAN
  2037.           LOCATE
  2038.           SCATTER MEMVAR MEMO
  2039.           DO restoreenv
  2040.         ENDFOR
  2041.       ENDIF
  2042.       IF m.match_drv
  2043.         DO delaybar WITH '',m.msg2,5
  2044.       ENDIF
  2045.       IF m.r_scxdata>RECCOUNT()
  2046.         EXIT
  2047.       ENDIF
  2048.       GOTO m.r_scxdata
  2049.       SCAN REST FOR (OBJTYPE=5.OR.BETWEEN(OBJTYPE,11,22)).AND..NOT.DELETED()
  2050.         IF ATC(m.c_size,COMMENT)=0.AND.ATC(m.c_nosize,COMMENT)=0)
  2051.           LOOP
  2052.         ENDIF
  2053.         FOR m.i = 1 TO MEMLINES(COMMENT)
  2054.           m.memline=ALLTRIM(MLINE(COMMENT,m.i))
  2055.           m.at_pos=ATC(m.c_size,m.memline)
  2056.           IF m.at_pos=1
  2057.             m.obj_expr=ALLTRIM(SUBSTR(m.memline,m.at_pos+LEN(m.c_size)))
  2058.             IF EMPTY(m.obj_expr)
  2059.               LOOP
  2060.             ENDIF
  2061.             REPLACE SHOW WITH 'SIZE '+m.obj_expr, HEIGHT WITH m.scxcount+;
  2062.                     IIF(OBJTYPE#15.OR.OBJCODE#2,-100,800),;
  2063.                     WIDTH WITH RECNO()+256, SPACING WITH 0,;
  2064.                     COMMENT WITH strtranc(COMMENT,m.c_size,m.m_size)
  2065.             a_scxupd(m.scxcount)='*'
  2066.             EXIT
  2067.           ELSE
  2068.             m.at_pos=ATC(m.c_nosize,m.memline)
  2069.             IF m.at_pos=1
  2070.               IF OBJTYPE#15.OR.OBJCODE#2
  2071.                 REPLACE SHOW WITH '', HEIGHT WITH m.scxcount-100,;
  2072.                         WIDTH WITH RECNO()+256, SPACING WITH 0,;
  2073.                         COMMENT WITH strtranc(COMMENT,m.c_nosize,m.m_nosize)
  2074.                 a_scxupd(m.scxcount)='*'
  2075.               ENDIF
  2076.               EXIT
  2077.             ENDIF
  2078.           ENDIF
  2079.         ENDFOR
  2080.       ENDSCAN
  2081.       IF m.r_scxdata>RECCOUNT()
  2082.         EXIT
  2083.       ENDIF
  2084.       GOTO m.r_scxdata
  2085.       SCAN REST FOR BETWEEN(OBJTYPE,11,22).AND..NOT.DELETED()
  2086.         m.at_line=ATCLINE(m.c_default,COMMENT)
  2087.         IF m.at_line=0
  2088.           LOOP
  2089.         ENDIF
  2090.         FOR m.i = m.at_line TO MEMLINES(COMMENT)
  2091.           m.memline=ALLTRIM(MLINE(COMMENT,m.i))
  2092.           IF m.i>m.at_line.AND..NOT.'*:'$m.memline
  2093.             m.at_pos=AT(m.cr,COMMENT,m.i)+1
  2094.             IF m.at_pos=1.OR.ATC(m.c_default,SUBSTR(COMMENT,m.at_pos))=0
  2095.               EXIT
  2096.             ENDIF
  2097.             LOOP
  2098.           ENDIF
  2099.           m.at_pos=ATC(m.c_default,m.memline)
  2100.           IF m.at_pos=1
  2101.             m.obj_expr=ALLTRIM(SUBSTR(m.memline,m.at_pos+LEN(m.c_default)))
  2102.             IF EMPTY(m.obj_expr)
  2103.               LOOP
  2104.             ENDIF
  2105.             DO CASE
  2106.               CASE BETWEEN(OBJTYPE,12,14)
  2107.                 REPLACE INITIALNUM WITH VAL(m.obj_expr)
  2108.               CASE OBJTYPE#11.AND.OBJTYPE#20
  2109.                 REPLACE INITIALVAL WITH m.obj_expr
  2110.             ENDCASE
  2111.             REPLACE COMMENT WITH strtranc(COMMENT,m.c_default,m.m_default)
  2112.             EXIT
  2113.           ENDIF
  2114.         ENDFOR
  2115.       ENDSCAN
  2116.       GOTO m.r_scxdata
  2117.       SCAN REST FOR .NOT.DELETED()
  2118.         m.at_line=ATCLINE(m.c_picture,COMMENT)
  2119.         IF m.at_line=0
  2120.           LOOP
  2121.         ENDIF
  2122.         FOR m.i = m.at_line TO MEMLINES(COMMENT)
  2123.           m.memline=ALLTRIM(MLINE(COMMENT,m.i))
  2124.           IF m.i>m.at_line.AND..NOT.'*:'$m.memline
  2125.             m.at_pos=AT(m.cr,COMMENT,m.i)+1
  2126.             IF m.at_pos=1.OR.ATC(m.c_picture,SUBSTR(COMMENT,m.at_pos))=0
  2127.               EXIT
  2128.             ENDIF
  2129.             LOOP
  2130.           ENDIF
  2131.           m.at_pos=ATC(m.c_picture,m.memline)
  2132.           IF m.at_pos=1
  2133.             m.obj_expr=ALLTRIM(SUBSTR(m.memline,m.at_pos+LEN(m.c_picture)))
  2134.             IF EMPTY(m.obj_expr).OR.(OBJTYPE=17.AND.STYLE#0)
  2135.               LOOP
  2136.             ENDIF
  2137.             DO CASE
  2138.               CASE OBJTYPE=17
  2139.                 IF (ATC('.BMP',m.obj_expr)>0.OR.ATC('.ICO',m.obj_expr)>0).AND.;
  2140.                    ((.NOT.LEFT(m.obj_expr,1)=="'".AND.;
  2141.                    .NOT.LEFT(m.obj_expr,1)=='"').OR.;
  2142.                    (.NOT.RIGHT(m.obj_expr,1)=="'".AND.;
  2143.                    .NOT.RIGHT(m.obj_expr,1)=='"')).AND..NOT.'+'$m.obj_expr
  2144.                   m.obj_expr='"'+m.obj_expr+'"'
  2145.                 ENDIF
  2146.                 REPLACE PICTURE WITH m.obj_expr,;
  2147.                         NAME WITH PICTURE+' BITMAP', STYLE WITH 1
  2148.               CASE BETWEEN(OBJTYPE,12,14).AND.;
  2149.                    'B'$SUBSTR(PICTURE,1,AT(' ',PICTURE))
  2150.                 DO CASE
  2151.                   CASE LEFT(m.obj_expr,1)==','
  2152.                     m.j=1
  2153.                   CASE LEFT(m.obj_expr,2)=="',"
  2154.                     m.j=2
  2155.                   CASE LEFT(m.obj_expr,2)=='",'
  2156.                     m.j=2
  2157.                   OTHERWISE
  2158.                     m.j=0
  2159.                 ENDCASE
  2160.                 IF m.j>0.AND.(','$m.obj_expr.OR.ATC('.BMP',m.obj_expr)>0.OR.;
  2161.                    ATC('.ICO',m.obj_expr)>0)
  2162.                   m.str_data=ALLTRIM(SUBSTR(PICTURE,AT(' ',PICTURE)))
  2163.                   m.str_data=LEFT(m.str_data,LEN(m.str_data)-1)
  2164.                   IF ';'$m.str_data
  2165.                     m.str_data=LEFT(m.str_data,AT(';',m.str_data)-1)
  2166.                   ENDIF
  2167.                   m.obj_expr=LEFT(m.obj_expr,m.j-1)+m.str_data+;
  2168.                              SUBSTR(m.obj_expr,m.j)
  2169.                 ENDIF
  2170.                 DO CASE
  2171.                   CASE (LEFT(m.obj_expr,1)=="'".OR.;
  2172.                        LEFT(m.obj_expr,1)=='"').AND.;
  2173.                        (RIGHT(m.obj_expr,1)=="'".OR.;
  2174.                        RIGHT(m.obj_expr,1)=='"').AND..NOT.'+'$m.obj_expr
  2175.                     m.str_data=ALLTRIM(SUBSTR(m.obj_expr,2,LEN(m.obj_expr)-2))+'"'
  2176.                   CASE ','$m.obj_expr.OR.ATC('.BMP',m.obj_expr)>0.OR.;
  2177.                        ATC('.ICO',m.obj_expr)>0
  2178.                     m.str_data=m.obj_expr+'"'
  2179.                   OTHERWISE
  2180.                     m.str_data='"+'+m.obj_expr
  2181.                 ENDCASE
  2182.                 REPLACE PICTURE WITH STRTRAN(SUBSTR(PICTURE,1,;
  2183.                                      AT(' ',PICTURE)),'B','b')+m.str_data
  2184.               OTHERWISE
  2185.                 REPLACE PICTURE WITH m.obj_expr
  2186.             ENDCASE
  2187.             EXIT
  2188.           ENDIF
  2189.         ENDFOR
  2190.       ENDSCAN
  2191.       m.obj_name=SPACE(LEN(FOXSCX.OBJNAME_))
  2192.       m.obj_base=SPACE(LEN(FOXSCX.OBJBASE_))
  2193.       SCAN ALL FOR .NOT.DELETED()
  2194.         RELEASE a_basobj
  2195.         DIMENSION a_basobj(1)
  2196.         m.basobjs=0
  2197.         m.at_line=1
  2198.         DO WHILE .T.
  2199.           m.at_line=ATCLINE(m.c_basobj,COMMENT)
  2200.           IF .NOT.BETWEEN(m.at_line,1,MEMLINES(COMMENT))
  2201.             EXIT
  2202.           ENDIF
  2203.           m.obj_lib=''
  2204.           m.obj_base=SPACE(LEN(FOXSCX.OBJBASE_))
  2205.           FOR m.i = m.at_line TO MEMLINES(COMMENT)
  2206.             m.memline=ALLTRIM(MLINE(COMMENT,m.i))
  2207.             IF m.i>m.at_line.AND..NOT.'*:'$m.memline
  2208.               m.at_pos=AT(m.cr,COMMENT,m.i)+1
  2209.               IF m.at_pos=1.OR.ATC(m.c_basobj,SUBSTR(COMMENT,m.at_pos))=0
  2210.                 EXIT
  2211.               ENDIF
  2212.               LOOP
  2213.             ENDIF
  2214.             m.at_pos=ATC(m.c_basobj,m.memline)
  2215.             IF m.at_pos=0
  2216.               LOOP
  2217.             ENDIF
  2218.             REPLACE COMMENT WITH strtranc(COMMENT,m.c_basobj,m.m_basobj,1,1)
  2219.             IF m.at_pos=1
  2220.               m.obj_base=PADR(ALLTRIM(SUBSTR(m.memline,m.at_pos+;
  2221.                          LEN(m.c_basobj))),LEN(FOXSCX.OBJBASE_))
  2222.               m.at_pos=AT('.',m.obj_base)
  2223.               IF m.at_pos>0
  2224.                 m.obj_lib=PADR(UPPER(CHRTRAN(ALLTRIM(LEFT(m.obj_base,m.at_pos-1)),;
  2225.                           m.badchars,m.stdascii)),LEN(FOXSCX.OBJLIB_))
  2226.                 m.obj_base=ALLTRIM(SUBSTR(m.obj_base,m.at_pos+1))
  2227.               ENDIF
  2228.               m.obj_base=PADR(CHRTRAN(m.obj_base,m.badchars,m.stdascii),;
  2229.                          LEN(FOXSCX.OBJBASE_)-LEN(FOXSCX.OBJLIB_)-1)
  2230.               EXIT
  2231.             ENDIF
  2232.           ENDFOR
  2233.           IF EMPTY(m.obj_base)
  2234.             LOOP
  2235.           ENDIF
  2236.           m.match=.F.
  2237.           m.r=RECNO()
  2238.           RELEASE a_fields
  2239.           DIMENSION a_fields(1)
  2240.           =AFIELDS(a_fields)
  2241.           RELEASE a_scatter
  2242.           SCATTER TO a_scatter MEMO
  2243.           SELECT FOXSCX
  2244.           SET ORDER TO OBJNAME_
  2245.           IF m.inclibs=0.AND.EMPTY(m.obj_lib)
  2246.             =warning(m.c_basobj,m.obj_base)
  2247.             LOOP
  2248.           ENDIF
  2249.           RELEASE a_size,a_pict
  2250.           DO WHILE .NOT.EMPTY(m.obj_base).AND.(m.inclibs>0.OR.;
  2251.                    .NOT.EMPTY(m.obj_lib))
  2252.             DO esc_check
  2253.             m.j=0
  2254.             m.at_pos=AT('.',m.obj_base)
  2255.             IF m.at_pos>0
  2256.               m.obj_lib=PADR(UPPER(ALLTRIM(LEFT(m.obj_base,m.at_pos-1))),;
  2257.                         LEN(FOXSCX.OBJLIB_))
  2258.               m.obj_base=ALLTRIM(SUBSTR(m.obj_base,m.at_pos+1))
  2259.             ENDIF
  2260.             m.obj_base=PADR(m.obj_base,LEN(FOXSCX.OBJBASE_)-;
  2261.                        LEN(FOXSCX.OBJLIB_)-1)
  2262.             IF EMPTY(m.obj_lib)
  2263.               m.lastexac=SET('EXACT')
  2264.               SET EXACT ON
  2265.               FOR m.i = 1 TO m.inclibs
  2266.                 SEEK UPPER(PADR(m.obj_base,LEN(OBJNAME_))+PADR(a_inclib(m.i),;
  2267.                            LEN(OBJLIB_)))
  2268.                 IF .NOT.EOF()
  2269.                   m.j=RECNO()
  2270.                   m.obj_lib=OBJLIB_
  2271.                   m.obj_base=OBJBASE_
  2272.                   EXIT
  2273.                 ENDIF
  2274.               ENDFOR
  2275.               IF m.lastexac=='ON'
  2276.                 SET EXACT ON
  2277.               ELSE
  2278.                 SET EXACT OFF
  2279.               ENDIF
  2280.             ELSE
  2281.               SEEK UPPER(m.obj_base+m.obj_lib)
  2282.               IF .NOT.EOF()
  2283.                 m.j=RECNO()
  2284.                 m.obj_base=OBJBASE_
  2285.               ENDIF
  2286.             ENDIF
  2287.             IF m.j=0.OR.(UPPER(OBJNAME_)==PADR(m.obj_base,LEN(OBJNAME_)).AND.;
  2288.                (OBJLIB_==m.obj_lib.OR.EMPTY(m.obj_lib)))
  2289.               =warning(m.c_basobj,m.obj_lib+'.'+m.obj_base)
  2290.               m.obj_lib=''
  2291.               m.obj_base=SPACE(LEN(OBJBASE_))
  2292.               EXIT
  2293.             ENDIF
  2294.             IF m.basobjs>0.AND.ASCAN(a_basobj,OBJLIB_+'.'+UPPER(OBJNAME_))>0
  2295.               m.obj_lib=''
  2296.               m.obj_base=SPACE(LEN(OBJBASE_))
  2297.               EXIT
  2298.             ENDIF
  2299.             m.j=RECCOUNT('SCXDATA')
  2300.             IF m.rec_count#m.j
  2301.               m.rec_total=m.rec_total+(m.j-m.rec_count)
  2302.               m.rec_count=m.j
  2303.             ENDIF
  2304.             m.i=m.r_scxdata-2
  2305.             m.msg3='['+ALLTRIM(m.platform_)+'] '+ALLTRIM(OBJLIB_)+'.'+;
  2306.                    OBJNAME_
  2307.             DO delaybar WITH '',m.msg3,85*(RECNO('SCXDATA')-m.i)/m.rec_total+10
  2308.             m.basobjs=m.basobjs+1
  2309.             DIMENSION a_basobj(m.basobjs)
  2310.             a_basobj(m.basobjs)=OBJLIB_+'.'+UPPER(OBJNAME_)
  2311.             m.basbefore=.F.
  2312.             m.old_text=''
  2313.             m.new_text=''
  2314.             FOR m.i = 1 TO ALEN(a_scatter)
  2315.               IF ALEN(a_scatter)=(FCOUNT()-m.fcountadj)
  2316.                 m.j=m.i
  2317.               ELSE
  2318.                 m.j=0
  2319.                 FOR m.k = 1 TO (FCOUNT()-m.fcountadj)
  2320.                   IF FIELD(m.k)==a_fields(4*m.i-3)
  2321.                     m.j=m.k
  2322.                     EXIT
  2323.                   ENDIF
  2324.                 ENDFOR
  2325.               ENDIF
  2326.               m.field_name=FIELD(m.j)
  2327.               IF m.field_name=='NAME'
  2328.                 m.old_text=NAME
  2329.                 m.new_text=a_scatter(m.i)
  2330.               ENDIF
  2331.               m.field_type=TYPE(FIELD(m.j))
  2332.               m.snpttype=-1
  2333.               IF m.i>6
  2334.                 IF ATC('TYPE',FIELD(m.j-1))>0.AND..NOT.EMPTY(a_scatter(m.i))
  2335.                   m.snpttype=a_scatter(m.i-1)
  2336.                 ENDIF
  2337.                 IF RIGHT(m.field_name,4)=='BLUE'
  2338.                   m.field_eval=EVALUATE(m.field_name)
  2339.                   IF m.field_eval#-1.AND.a_scatter(m.i)=-1.AND.;
  2340.                      a_scatter(m.i-1)=-1.AND.a_scatter(m.i-2)=-1
  2341.                     a_scatter(m.i)=m.field_eval
  2342.                     a_scatter(m.i-1)=EVALUATE(FIELD(m.j-1))
  2343.                     a_scatter(m.i-2)=EVALUATE(FIELD(m.j-2))
  2344.                   ENDIF
  2345.                   LOOP
  2346.                 ENDIF
  2347.                 IF SCXDATA.OBJTYPE=1.AND.SCXDATA.STYLE>1.AND.;
  2348.                    INLIST(m.field_name,'SCHEME','SCHEME2','FLOAT','CLOSE',;
  2349.                           'MINIMIZE','BORDER','SHADOW')
  2350.                   LOOP
  2351.                 ENDIF
  2352.                 IF 'PEN'$m.field_name.OR.'FILL'$m.field_name
  2353.                   LOOP
  2354.                 ENDIF
  2355.                 IF LEFT(m.field_name,4)=='FONT'
  2356.                   IF m.field_name=='FONTSIZE'.AND.a_scatter(m.i)=8.AND.;
  2357.                     a_scatter(m.i-1)<1.AND.;
  2358.                     a_scatter(m.i-2)=='MS Sans Serif'
  2359.                     a_scatter(m.i)=EVALUATE(m.field_name)
  2360.                     a_scatter(m.i-1)=EVALUATE(FIELD(m.j-1))
  2361.                     a_scatter(m.i-2)=EVALUATE(FIELD(m.j-2))
  2362.                   ENDIF
  2363.                   LOOP
  2364.                 ENDIF
  2365.                 IF 'FONT'$m.field_name
  2366.                   LOOP
  2367.                 ENDIF
  2368.               ENDIF
  2369.               IF (EMPTY(a_scatter(m.i)).OR.m.snpttype#-1.OR.;
  2370.                  (FIELD(m.j)=='PICTURE'.AND.UPPER(a_scatter(m.i))=='"@K"').OR.;
  2371.                  m.field_type=='L'.OR.(FIELD(m.j)=='COMMENT'.AND.;
  2372.                  ATC(m.c_instxt,a_scatter(m.i))=0)).AND.;
  2373.                  ATC('TYPE',FIELD(m.j))=0.AND.;
  2374.                  .NOT.INLIST(FIELD(m.j),'VPOS','HPOS','HEIGHT','WIDTH').AND.;
  2375.                  (RECNO()>=m.r_scxdata.OR..NOT.INLIST(FIELD(m.j),'STYLE',;
  2376.                  'ORDER','UNIQUE','ENVIRON','TAG','TAG2'))
  2377.                 m.match=.T.
  2378.                 IF m.i>6.AND.ATC('TYPE',FIELD(m.j-1))>0.AND.;
  2379.                    .NOT.EMPTY(EVALUATE(FIELD(m.j)))
  2380.                   a_scatter(m.i-1)=EVALUATE(FIELD(m.j-1))
  2381.                 ENDIF
  2382.                 m.field_eval=EVALUATE(m.field_name)
  2383.                 IF m.i>5.AND.m.snpttype#-1.AND..NOT.EMPTY(m.field_eval).AND.;
  2384.                    m.snpttype#EVALUATE(FIELD(m.j-1))
  2385.                   SELECT SCXDATA
  2386.                   m.r2=RECNO()
  2387.                   LOCATE
  2388.                   m.memline=SYS(2015)
  2389.                   IF m.snpttype=1
  2390.                     REPLACE PROCCODE WITH PROCCODE+m.cr_lf+;
  2391.                            'FUNCTION '+m.memline+m.cr_lf+m.cr_lf+;
  2392.                            strtranc(a_scatter(m.i),m.old_text,;
  2393.                                     m.new_text)+m.cr_lf
  2394.                     a_scatter(m.i)=m.memline+'()'
  2395.                   ELSE
  2396.                     REPLACE PROCCODE WITH PROCCODE+m.cr_lf+;
  2397.                            'FUNCTION '+m.memline+m.cr_lf+m.cr_lf+;
  2398.                            strtranc(m.field_eval,m.old_text,;
  2399.                                     m.new_text)+m.cr_lf
  2400.                     m.field_eval=m.memline+'()'
  2401.                   ENDIF
  2402.                   GOTO m.r2
  2403.                   SELECT FOXSCX
  2404.                   a_scatter(m.i-1)=0
  2405.                   m.snpttype=0
  2406.                 ENDIF
  2407.                 DO CASE
  2408.                   CASE EMPTY(m.field_eval)
  2409.                     =.F.
  2410.                   CASE (m.snpttype=-1.OR..NOT.m.field_type=='M').AND.;
  2411.                        .NOT.FIELD(m.j)=='COMMENT'
  2412.                     a_scatter(m.i)=m.field_eval
  2413.                   CASE m.snpttype=0.AND..NOT.FIELD(m.j)=='COMMENT'
  2414.                     IF LEFT(FIELD(m.j),5)=='RANGE'
  2415.                       =.F.
  2416.                     ELSE
  2417.                       m.field_eval=STRTRAN(STRTRAN(ALLTRIM(m.field_eval),;
  2418.                                    m.cr,''),m.lf,'')
  2419.                       a_scatter(m.i)=STRTRAN(STRTRAN(ALLTRIM(a_scatter(m.i)),;
  2420.                                    m.cr,''),m.lf,'')
  2421.                       DO CASE
  2422.                         CASE LEFT(m.field_eval,7)=='.T..OR.'.OR.;
  2423.                              LEFT(m.field_eval,7)=='.T. OR '
  2424.                           m.str_data=a_scatter(m.i)
  2425.                           m.str_data2=').OR.('
  2426.                           m.str_data3=SUBSTR(m.field_eval,8)
  2427.                         CASE RIGHT(m.field_eval,7)=='.OR..T.'.OR.;
  2428.                              RIGHT(m.field_eval,7)==' OR .T.'
  2429.                           m.str_data=a_scatter(m.i)
  2430.                           m.str_data2=').OR.('
  2431.                           m.str_data3=LEFT(m.field_eval,LEN(m.field_eval)-7)
  2432.                         CASE LEFT(a_scatter(m.i),7)=='.T..OR.'.OR.;
  2433.                              LEFT(a_scatter(m.i),7)=='.T. OR '
  2434.                           m.str_data=SUBSTR(a_scatter(m.i),8)
  2435.                           m.str_data2=').OR.('
  2436.                           m.str_data3=m.field_eval
  2437.                         CASE RIGHT(a_scatter(m.i),7)=='.OR..T.'.OR.;
  2438.                              RIGHT(a_scatter(m.i),7)==' OR .T.'
  2439.                           m.str_data=LEFT(a_scatter(m.i),LEN(a_scatter(m.i))-7)
  2440.                           m.str_data2=').OR.('
  2441.                           m.str_data3=m.field_eval
  2442.                         OTHERWISE
  2443.                           m.str_data=a_scatter(m.i)
  2444.                           m.str_data2=').AND.('
  2445.                           m.str_data3=m.field_eval
  2446.                       ENDCASE
  2447.                       IF m.basbefore
  2448.                         a_scatter(m.i)='('+m.str_data3+m.str_data2+;
  2449.                                        m.str_data+')'
  2450.                       ELSE
  2451.                         a_scatter(m.i)='('+m.str_data+m.str_data2+;
  2452.                                        m.str_data3+')'
  2453.                       ENDIF
  2454.                     ENDIF
  2455.                   OTHERWISE
  2456.                     SELECT SCXDATA
  2457.                     IF m.basbefore.AND..NOT.FIELD(m.j)=='COMMENT'
  2458.                       IF .NOT.RIGHT(m.field_eval,2)==m.cr_lf
  2459.                         m.field_eval=m.field_eval+m.cr_lf
  2460.                       ENDIF
  2461.                       a_scatter(m.i)=m.field_eval+a_scatter(m.i)
  2462.                     ELSE
  2463.                       IF .NOT.RIGHT(a_scatter(m.i),2)==m.cr_lf
  2464.                         a_scatter(m.i)=a_scatter(m.i)+m.cr_lf
  2465.                       ENDIF
  2466.                       a_scatter(m.i)=a_scatter(m.i)+m.field_eval
  2467.                     ENDIF
  2468.                     SELECT FOXSCX
  2469.                 ENDCASE
  2470.                 DO CASE
  2471.                   CASE FIELD(m.j)=='COMMENT'
  2472.                     SELECT SCXDATA
  2473.                     REPLACE COMMENT WITH a_scatter(m.i)
  2474.                     IF .NOT.wordsearch(m.c_basbefore)==m.null
  2475.                       m.basbefore=.T.
  2476.                       REPLACE COMMENT WITH strtranc(COMMENT,m.c_basbefore,;
  2477.                                            m.m_basbefore)
  2478.                       a_scatter(m.i)=COMMENT
  2479.                     ENDIF
  2480.                     IF .NOT.wordsearch(m.c_svsize)==m.null
  2481.                       RELEASE a_size
  2482.                       DIMENSION a_size(4)
  2483.                       a_size(1)=FOXSCX.HEIGHT
  2484.                       a_size(2)=FOXSCX.WIDTH
  2485.                       a_size(3)=FOXSCX.INITIALNUM
  2486.                       a_size(4)=FOXSCX.SPACING
  2487.                       REPLACE COMMENT WITH strtranc(COMMENT,m.c_svsize,;
  2488.                                            m.m_svsize)
  2489.                       a_scatter(m.i)=COMMENT
  2490.                     ENDIF
  2491.                     IF .NOT.wordsearch(m.c_svpict)==m.null
  2492.                       RELEASE a_pict
  2493.                       DIMENSION a_pict(3)
  2494.                       a_pict(1)=FOXSCX.PICTURE
  2495.                       a_pict(2)=FOXSCX.INITIALVAL
  2496.                       a_pict(3)=STR(FOXSCX.INITIALNUM,9,3)
  2497.                       REPLACE COMMENT WITH strtranc(COMMENT,m.c_svpict,;
  2498.                                            m.m_svpict)
  2499.                       a_scatter(m.i)=COMMENT
  2500.                     ENDIF
  2501.                     m.loop_obj=.T.
  2502.                     SELECT FOXSCX
  2503.                   CASE m.field_type=='M'.AND..NOT.m.old_text==m.new_text
  2504.                     IF .NOT.EMPTY(a_scatter(m.i))
  2505.                       a_scatter(m.i)=strtranc(a_scatter(m.i),m.old_text,;
  2506.                                      m.new_text)
  2507.                     ENDIF
  2508.                 ENDCASE
  2509.               ENDIF
  2510.             ENDFOR
  2511.           ENDDO
  2512.           SELECT SCXDATA
  2513.           GOTO m.r
  2514.           IF m.match
  2515.             GATHER FROM a_scatter MEMO
  2516.             IF TYPE('a_size')=='N'
  2517.               REPLACE HEIGHT WITH a_size(1)
  2518.               REPLACE WIDTH WITH a_size(2)
  2519.               IF OBJTYPE=15
  2520.                 REPLACE INITIALNUM WITH a_size(3)
  2521.               ENDIF
  2522.               REPLACE SPACING WITH a_size(4)
  2523.             ENDIF
  2524.             IF TYPE('a_pict')=='C'
  2525.               REPLACE PICTURE WITH a_pict(1)
  2526.               IF BETWEEN(OBJTYPE,12,14)
  2527.                 REPLACE INITIALVAL WITH a_pict(2),;
  2528.                         INITIALNUM WITH VAL(a_pict(3))
  2529.               ENDIF
  2530.             ENDIF
  2531.             RELEASE a_size,a_pict
  2532.             IF .NOT.m.ignrbraces.AND.m.braces=='ON'
  2533.               =evlrec()
  2534.             ENDIF
  2535.           ENDIF
  2536.         ENDDO
  2537.       ENDSCAN
  2538.       m.match_drv=.F.
  2539.       IF m.gen_mode.AND.a_scxdrvs(5)>0
  2540.         m.drv_no=5
  2541.         FOR m.drv_cnt = 1 TO a_scxdrvs(5)
  2542.           IF ASCAN(a_drvoff,FULLPATH(a_scxdrv(m.drv_cnt,5)))>0
  2543.             LOOP
  2544.           ENDIF
  2545.           m.msg3='['+ALLTRIM(m.platform_)+'] '+trimpath(a_scxdrv(m.drv_cnt,5),.F.,.T.)
  2546.           DO delaybar WITH '',m.msg3,90*m.drv_cnt/a_scxdrvs(5)+5
  2547.           SCAN ALL FOR .NOT.DELETED()
  2548.             m.match_drv=.T.
  2549.             DO (a_scxdrv(m.drv_cnt,5))
  2550.             DO esc_check
  2551.           ENDSCAN
  2552.           LOCATE
  2553.           SCATTER MEMVAR MEMO
  2554.           DO restoreenv
  2555.         ENDFOR
  2556.       ENDIF
  2557.       IF m.match_drv
  2558.         DO delaybar WITH '',m.msg2,5
  2559.       ENDIF
  2560.       IF .NOT.m.loop_obj
  2561.         EXIT
  2562.       ENDIF
  2563.       IF .NOT.m.loop_flag
  2564.         m.loop_flag=.T.
  2565.         m.setfilter='(DEACTTYPE<=1.OR.OBJTYPE<=1)'
  2566.         IF .NOT.EMPTY(m.lastfilter)
  2567.           m.setfilter=m.lastfilter+'.AND.'+m.setfilter
  2568.         ENDIF
  2569.         LOCATE
  2570.       ENDIF
  2571.       SCAN ALL FOR .NOT.DELETED()
  2572.         DO CASE
  2573.           CASE RECNO()<m.r_scxdata
  2574.             IF DEACTTYPE<=1
  2575.               REPLACE ACTIVTYPE WITH ACTIVTYPE+2, DEACTTYPE WITH DEACTTYPE+2
  2576.             ENDIF
  2577.           CASE ACTIVTYPE=2
  2578.             REPLACE ACTIVTYPE WITH 0, DEACTTYPE WITH 0
  2579.           CASE ATC(m.c_basobj,COMMENT)=0.AND.ATC(m.c_insobj,COMMENT)=0.AND.;
  2580.                ATC(m.c_insscx,COMMENT)=0.AND.ATC(m.c_trntxt,COMMENT)=0.AND.;
  2581.                ATC(m.c_if,COMMENT)=0.AND.ATC(m.c_size,COMMENT)=0.AND.;
  2582.                ATC(m.c_nosize,COMMENT)=0.AND.ATC(m.c_default,COMMENT)=0.AND.;
  2583.                ATC(m.c_evltxt,COMMENT)=0
  2584.             REPLACE DEACTTYPE WITH 2
  2585.         ENDCASE
  2586.       ENDSCAN
  2587.       SET FILTER TO &setfilter
  2588.       LOCATE
  2589.       IF EOF()
  2590.         EXIT
  2591.       ENDIF
  2592.       m.match_drv=.F.
  2593.       IF m.gen_mode.AND.a_scxdrvs(6)>0
  2594.         m.drv_no=6
  2595.         FOR m.drv_cnt = 1 TO a_scxdrvs(6)
  2596.           IF ASCAN(a_drvoff,FULLPATH(a_scxdrv(m.drv_cnt,6)))>0
  2597.             LOOP
  2598.           ENDIF
  2599.           m.msg3='['+ALLTRIM(m.platform_)+'] '+trimpath(a_scxdrv(m.drv_cnt,6),.F.,.T.)
  2600.           DO delaybar WITH '',m.msg3,90*m.drv_cnt/a_scxdrvs(6)+5
  2601.           SCAN ALL FOR .NOT.DELETED()
  2602.             m.match_drv=.T.
  2603.             DO (a_scxdrv(m.drv_cnt,6))
  2604.             DO esc_check
  2605.           ENDSCAN
  2606.           LOCATE
  2607.           SCATTER MEMVAR MEMO
  2608.           DO restoreenv
  2609.         ENDFOR
  2610.       ENDIF
  2611.       IF m.match_drv
  2612.         DO delaybar WITH '',m.msg2,5
  2613.       ENDIF
  2614.     ENDDO
  2615.     IF m.gen_mode
  2616.       DO delaybar WITH '',m.msg2,95
  2617.     ENDIF
  2618.     IF m.loop_flag
  2619.       IF EMPTY(m.lastfilter)
  2620.         SET FILTER TO
  2621.       ELSE
  2622.         SET FILTER TO &lastfilter
  2623.       ENDIF
  2624.       REPLACE ALL ACTIVTYPE WITH MAX(ACTIVTYPE-2,0),;
  2625.                   DEACTTYPE WITH MAX(DEACTTYPE-2,0)
  2626.     ENDIF
  2627.     SCAN ALL FOR .NOT.DELETED()
  2628.       IF wordsearch(m.c_delete)==m.null
  2629.         LOOP
  2630.       ENDIF
  2631.       =delrec()
  2632.       REPLACE COMMENT WITH strtranc(COMMENT,m.c_delete,m.m_delete)
  2633.     ENDSCAN
  2634.     IF m.r_scxdata>RECCOUNT()
  2635.       EXIT
  2636.     ENDIF
  2637.     IF m.gen_mode
  2638.       GOTO m.r_scxdata
  2639.       SCAN REST FOR .NOT.DELETED()
  2640.         m.at_pos=ATC(m.c_trntxt,COMMENT)
  2641.         IF m.at_pos=0
  2642.           LOOP
  2643.         ENDIF
  2644.         m.str_data=SUBSTR(COMMENT,m.at_pos)
  2645.         FOR m.i = 1 TO MEMLINES(m.str_data)
  2646.           m.memline=ALLTRIM(MLINE(m.str_data,m.i))
  2647.           m.at_pos=ATC(m.c_trntxt,m.memline)
  2648.           IF m.at_pos=1
  2649.             m.at_pos=AT('||',m.memline)
  2650.             IF m.at_pos=0
  2651.               LOOP
  2652.             ENDIF
  2653.             m.old_text=ALLTRIM(SUBSTR(m.memline,LEN(m.c_trntxt)+1,m.at_pos-;
  2654.                        LEN(m.c_trntxt)-1))
  2655.             IF LEN(m.old_text)=0
  2656.               LOOP
  2657.             ENDIF
  2658.             m.old_text=STRTRAN(STRTRAN(STRTRAN(STRTRAN(m.old_text,'\\',;
  2659.                        '\'),'\t',CHR(9)),'\n',CHR(10)),'\r',CHR(13))
  2660.             m.at_pos2=AT('||',m.memline,2)
  2661.             m.new_text=ALLTRIM(SUBSTR(m.memline,m.at_pos+2,;
  2662.                        IIF(m.at_pos2=0,LEN(m.memline),m.at_pos2-m.at_pos-2)))
  2663.             m.new_text=STRTRAN(STRTRAN(STRTRAN(STRTRAN(m.new_text,'\\',;
  2664.                        '\'),'\t',CHR(9)),'\n',CHR(10)),'\r',CHR(13))
  2665.             m.match_pos=.F.
  2666.             m.match_no=.F.
  2667.             IF m.at_pos2>0
  2668.               m.at_pos=AT('||',m.memline,3)
  2669.               m.match_pos=VAL(SUBSTR(m.memline,m.at_pos2+2,;
  2670.                           IIF(m.at_pos=0,LEN(m.memline),m.at_pos-m.at_pos2-2)))
  2671.               IF m.at_pos>0
  2672.                 m.match_no=VAL(SUBSTR(m.memline,m.at_pos+2))
  2673.               ENDIF
  2674.             ENDIF
  2675.             REPLACE COMMENT WITH STRTRAN(COMMENT,m.memline+m.cr_lf,'')
  2676.             IF m.memline$COMMENT
  2677.               REPLACE COMMENT WITH STRTRAN(COMMENT,m.memline,'')
  2678.             ENDIF
  2679.             FOR m.j = 1 TO FCOUNT()
  2680.               m.field_name=FIELD(m.j)
  2681.               IF TYPE(m.field_name)#'M'
  2682.                 LOOP
  2683.               ENDIF
  2684.               m.field_eval=EVALUATE(m.field_name)
  2685.               IF ATC(m.old_text,m.field_eval)>0
  2686.                 REPLACE (m.field_name) WITH strtranc(m.field_eval,m.old_text,;
  2687.                                             m.new_text,m.match_pos,m.match_no)
  2688.               ENDIF
  2689.             ENDFOR
  2690.           ENDIF
  2691.         ENDFOR
  2692.       ENDSCAN
  2693.     ENDIF
  2694.     IF m.gen_mode.AND.m.name_mode
  2695.       SCAN ALL FOR .NOT.DELETED()
  2696.         FOR m.j = 1 TO FCOUNT()
  2697.           m.field_name=FIELD(m.j)
  2698.           m.field_type=TYPE(m.field_name)
  2699.           IF m.field_type#'M'
  2700.             LOOP
  2701.           ENDIF
  2702.           m.field_eval=EVALUATE(m.field_name)
  2703.           m.at_line=ATCLINE(m.p_name,m.field_eval)
  2704.           IF m.at_line=0
  2705.             LOOP
  2706.           ENDIF
  2707.           FOR m.i = m.at_line TO MEMLINES(m.field_eval)
  2708.             m.memline=ALLTRIM(MLINE(m.field_eval,m.i))
  2709.             IF m.i>m.at_line.AND..NOT.'*:'$m.memline
  2710.               m.at_pos=AT(m.cr,m.field_eval,m.i)+1
  2711.               IF m.at_pos=1.OR.ATC(m.p_name,SUBSTR(m.field_eval,m.at_pos))=0
  2712.                 EXIT
  2713.               ENDIF
  2714.               LOOP
  2715.             ENDIF
  2716.             m.at_pos=ATC(m.p_name,m.memline)
  2717.             IF m.at_pos=1
  2718.               m.snptname=ALLTRIM(UPPER(LEFT(CHRTRAN(STRTRAN(SUBSTR(m.memline,;
  2719.                          m.at_pos+LEN(m.p_name)),CHR(9),' '),m.badchars,;
  2720.                          m.stdascii),9)))
  2721.               IF EMPTY(m.snptname)
  2722.                 EXIT
  2723.               ENDIF
  2724.               m.snptname_=m.snptname+IIF(TYPE('PLATFORM')#'C','D',;
  2725.                           LEFT(PLATFORM,1))
  2726.               REPLACE (m.field_name) WITH STRTRAN(m.field_eval,m.memline,;
  2727.                                           m.p_name+' '+m.snptname_)
  2728.               m.fnctname='FUNCTION '+m.snptname+m.cr_lf
  2729.               m.r=RECNO()
  2730.               LOCATE
  2731.               IF m.fnctname$PROCCODE
  2732.                 GOTO m.r
  2733.                 EXIT
  2734.               ENDIF
  2735.               m.paramlist=''
  2736.               m.at_line=ATCLINE(m.s_para,m.field_eval)
  2737.               IF m.at_line>0
  2738.                 FOR m.k = m.at_line TO MEMLINES(m.field_eval)
  2739.                   m.memline=ALLTRIM(STRTRAN(MLINE(m.field_eval,m.k),;
  2740.                             CHR(9),' '))
  2741.                   IF m.k>m.at_line.AND..NOT.'*:'$m.memline
  2742.                     m.at_pos=AT(m.cr,m.field_eval,m.k)+1
  2743.                     IF m.at_pos=1.OR.ATC(m.c_s_para,;
  2744.                        SUBSTR(m.field_eval,m.at_pos))=0
  2745.                       EXIT
  2746.                     ENDIF
  2747.                     LOOP
  2748.                   ENDIF
  2749.                   m.at_pos=ATC(m.s_para,m.memline)
  2750.                   IF m.at_pos=1
  2751.                     m.at_pos=AT(' ',m.memline)
  2752.                     IF m.at_pos>0
  2753.                       m.paramlist=ALLTRIM(SUBSTR(m.memline,m.at_pos))
  2754.                       DO WHILE .T.
  2755.                         IF .NOT.RIGHT(m.paramlist,1)==';'
  2756.                           EXIT
  2757.                         ENDIF
  2758.                         m.paramlist=LEFT(m.paramlist,LEN(m.paramlist)-1)
  2759.                         m.k=m.k+1
  2760.                         IF m.k>MEMLINES(m.field_eval)
  2761.                           EXIT
  2762.                         ENDIF
  2763.                         m.paramlist=m.paramlist+ALLTRIM(STRTRAN(MLINE(;
  2764.                                     m.field_eval,m.k),CHR(9),' '))
  2765.                       ENDDO
  2766.                     ENDIF
  2767.                     EXIT
  2768.                   ENDIF
  2769.                 ENDFOR
  2770.               ENDIF
  2771.               m.new_text=m.cr_lf+m.cr_lf+m.fnctname+;
  2772.                          IIF(EMPTY(m.paramlist),'','PARAMETERS '+;
  2773.                          m.paramlist+m.cr_lf)+m.cr_lf+'DO CASE'+m.cr_lf
  2774.               FOR m.k = 1 TO 4
  2775.                 DO CASE
  2776.                   CASE m.k=1
  2777.                     m.new_text=m.new_text+'  CASE _DOS'+m.cr_lf+;
  2778.                                '    RETURN '+m.snptname+;
  2779.                                'D('+m.paramlist+')'+m.cr_lf
  2780.                   CASE m.k=2
  2781.                     m.new_text=m.new_text+'  CASE _WINDOWS'+m.cr_lf+;
  2782.                                '    RETURN '+m.snptname+;
  2783.                                'W('+m.paramlist+')'+m.cr_lf
  2784.                   CASE m.k=3
  2785.                     m.new_text=m.new_text+'  CASE _MAC'+m.cr_lf+;
  2786.                                '    RETURN '+m.snptname+;
  2787.                                'M('+m.paramlist+')'+m.cr_lf
  2788.                   CASE m.k=4
  2789.                     m.new_text=m.new_text+'  CASE _UNIX'+m.cr_lf+;
  2790.                                '    RETURN '+m.snptname+;
  2791.                                'U('+m.paramlist+')'+m.cr_lf
  2792.                 ENDCASE
  2793.               ENDFOR
  2794.               FOR m.k = 1 TO 4
  2795.                 m.fnctnames=m.fnctnames+1
  2796.                 DIMENSION a_fnctname(m.fnctnames,2)
  2797.                 a_fnctname(m.fnctnames,1)=m.snptname+SUBSTR('DWMU',m.k,1)
  2798.                 a_fnctname(m.fnctnames,2)=m.paramlist
  2799.               ENDFOR
  2800.               m.new_text=m.new_text+'ENDCASE'+m.cr_lf+'RETURN .F.'+m.cr_lf
  2801.               REPLACE PROCCODE WITH PROCCODE+m.new_text
  2802.               GOTO m.r
  2803.               EXIT
  2804.             ENDIF
  2805.           ENDFOR
  2806.         ENDFOR
  2807.       ENDSCAN
  2808.     ENDIF
  2809.     m.match_drv=.F.
  2810.     IF m.gen_mode.AND.a_scxdrvs(7)>0
  2811.       m.drv_no=7
  2812.       FOR m.drv_cnt = 1 TO a_scxdrvs(7)
  2813.         IF ASCAN(a_drvoff,FULLPATH(a_scxdrv(m.drv_cnt,7)))>0
  2814.           LOOP
  2815.         ENDIF
  2816.         m.msg3='['+ALLTRIM(m.platform_)+'] '+trimpath(a_scxdrv(m.drv_cnt,7),.F.,.T.)
  2817.         DO delaybar WITH '',m.msg3,90*m.drv_cnt/a_scxdrvs(7)+5
  2818.         SCAN ALL FOR .NOT.DELETED()
  2819.           m.match_drv=.T.
  2820.           DO (a_scxdrv(m.drv_cnt,7))
  2821.           DO esc_check
  2822.         ENDSCAN
  2823.         LOCATE
  2824.         SCATTER MEMVAR MEMO
  2825.         DO restoreenv
  2826.       ENDFOR
  2827.     ENDIF
  2828.     IF m.match_drv
  2829.       DO delaybar WITH '',m.msg2,96
  2830.     ENDIF
  2831.     IF m.gen_mode.OR.m.lib_mode
  2832.       GOTO m.r_scxdata
  2833.       IF .NOT.m.lib_mode
  2834.         IF .NOT.EMPTY(m.section3)
  2835.           LOCATE
  2836.           GOTO BOTTOM
  2837.           IF insrec()
  2838.             =instxt2(m.section3)
  2839.           ENDIF
  2840.           m.section3=m.null
  2841.         ENDIF
  2842.         DO delaybar WITH '',m.msg2,96
  2843.       ENDIF
  2844.       RECALL ALL WHILE RECNO()<m.r_scxdata
  2845.       IF m.r_scxdata>RECCOUNT()
  2846.         m.i=0
  2847.       ELSE
  2848.         GOTO m.r_scxdata
  2849.         COUNT REST FOR DELETED() TO m.i
  2850.       ENDIF
  2851.       IF m.i>0
  2852.         DO packscx
  2853.       ENDIF
  2854.       IF m.r_scxdata>RECCOUNT()
  2855.         EXIT
  2856.       ENDIF
  2857.       GOTO m.r_scxdata
  2858.       IF m.gen_mode
  2859.         SCAN REST FOR .NOT.DELETED()
  2860.           IF OBJTYPE>=32
  2861.             LOOP
  2862.           ENDIF
  2863.           m.i=ATCLINE(m.c_instxt,COMMENT)
  2864.           IF m.i=0
  2865.             LOOP
  2866.           ENDIF
  2867.           IF ATC(m.c_instxt,MLINE(COMMENT,m.i))#1
  2868.             LOOP
  2869.           ENDIF
  2870.           IF OBJTYPE<32
  2871.             REPLACE STYLE WITH 0
  2872.           ENDIF
  2873.           REPLACE OBJTYPE WITH 15, OBJCODE WITH 0, EXPR WITH '',;
  2874.                   VPOS WITH -m.scxcount, HPOS WITH RECNO()+256,;
  2875.                   HEIGHT WITH 0, WIDTH WITH 0, PICTURE WITH '',;
  2876.                   BOXCHAR WITH '', FILLCHAR WITH '', SCHEME WITH 0,;
  2877.                   SCHEME2 WITH -1, COLORPAIR WITH ''
  2878.           IF TYPE('PLATFORM')=='C'
  2879.             REPLACE PENRED WITH -1, PENGREEN WITH -1, PENBLUE WITH -1,;
  2880.                     FILLRED WITH -1, FILLGREEN WITH -1, FILLBLUE WITH -1,;
  2881.                     PENSIZE WITH -1, PENPAT WITH -1, FONTFACE WITH '',;
  2882.                     FONTSTYLE WITH 0, FONTSIZE WITH 0
  2883.           ENDIF
  2884.           a_scxupd(m.scxcount)='*'
  2885.           REPLACE COMMENT WITH strtranc(COMMENT,m.c_instxt,m.m_instxt)
  2886.         ENDSCAN
  2887.       ENDIF
  2888.       IF .NOT.m.lib_mode
  2889.         DO delaybar WITH '',m.msg2,97
  2890.       ENDIF
  2891.       SELECT FOXSCX
  2892.       SET ORDER TO OBJSCX_
  2893.       m.i=0
  2894.       SEEK m.scx_name+m.lib_name
  2895.       SCAN REST FOR .NOT.OBJFLAG_;
  2896.            WHILE OBJSCX_==m.scx_name.AND.OBJLIB_==m.lib_name
  2897.         m.i=1
  2898.         DELETE
  2899.       ENDSCAN
  2900.       IF m.i>0
  2901.         DO delaybar WITH '','Packing:  '+m.ffoxscx,99
  2902.         PACK
  2903.       ENDIF
  2904.       LOCATE
  2905.     ENDIF
  2906.     SELECT SCXDATA
  2907.     IF m.gen_mode
  2908.       GOTO m.r_scxdata
  2909.       SCAN REST FOR (OBJTYPE=5.OR.OBJTYPE=7.OR.OBJTYPE=17).AND..NOT.DELETED()
  2910.         m.str_data=nobrackets(wordsearch(m.c_click))
  2911.         IF EMPTY(m.str_data).OR.m.str_data==m.null
  2912.           LOOP
  2913.         ENDIF
  2914.         IF .NOT.RIGHT(m.str_data,1)==')'
  2915.           m.str_data=m.str_data+'()'
  2916.         ENDIF
  2917.         m.str_data="MDOWN().AND.BETWEEN(MROW(),"+ALLTRIM(STR(VPOS,9,3))+","+;
  2918.                    ALLTRIM(STR(VPOS+objheight(),9,3))+").AND.BETWEEN(MCOL(),"+;
  2919.                    ALLTRIM(STR(HPOS,9,3))+","+ALLTRIM(STR(HPOS+objwidth(),9,3))+;
  2920.                    ").AND."+m.str_data+".AND..F."
  2921.         m.r=RECNO()
  2922.         m.vpos2=VPOS
  2923.         m.hpos2=HPOS
  2924.         m.height2=objheight()
  2925.         m.width2=objwidth()
  2926.         GOTO m.r_scxdata
  2927.         IF .NOT.insrec(-1)
  2928.           GOTO m.r
  2929.           LOOP
  2930.         ENDIF
  2931.         REPLACE VPOS WITH m.vpos2, HPOS WITH m.hpos2,;
  2932.                 HEIGHT WITH m.height2, WIDTH WITH m.width2
  2933.         REPLACE OBJTYPE WITH 20, OBJCODE WITH 1,;
  2934.                 NAME WITH 'm.null'+ALLTRIM(STR(RECNO(),6)), EXPR WITH '',;
  2935.                 PICTURE WITH '"@*IHN "',;
  2936.                 WHENTYPE WITH 0, WHEN WITH m.str_data,;
  2937.                 INITIALVAL WITH '', INITIALNUM WITH 0, COMMENT WITH ''
  2938.         IF _FOX25
  2939.           REPLACE FONTFACE WITH m.fontface,;
  2940.                   FONTSTYLE WITH m.fontstyle, FONTSIZE WITH m.fontsize
  2941.         ENDIF
  2942.         GOTO m.r
  2943.         SKIP
  2944.       ENDSCAN
  2945.       GOTO m.r_scxdata
  2946.       SCAN REST FOR .NOT.REFRESH.AND..NOT.DELETED()
  2947.         m.str_data=wordsearch(m.c_refresh)
  2948.         IF m.str_data=m.null
  2949.           LOOP
  2950.         ENDIF
  2951.         REPLACE REFRESH WITH .T.
  2952.       ENDSCAN
  2953.       GOTO m.r_scxdata
  2954.       m.new_text=''
  2955.       SCAN REST FOR .NOT.DELETED()
  2956.         m.old_text=COMMENT
  2957.         DO WHILE .T.
  2958.           m.at_pos=ATC(m.c_function,m.old_text)
  2959.           IF m.at_pos=0
  2960.             EXIT
  2961.           ENDIF
  2962.           m.old_text=SUBSTR(m.old_text,m.at_pos+2)
  2963.           m.at_pos=ATC(m.c_endfnct,m.old_text)
  2964.           IF m.at_pos=0
  2965.             m.new_text=m.new_text+m.cr_lf+m.old_text+m.cr_lf
  2966.             EXIT
  2967.           ENDIF
  2968.           m.new_text=m.new_text+m.cr_lf+LEFT(m.old_text,m.at_pos-1)+m.cr_lf
  2969.           m.old_text=SUBSTR(m.old_text,m.at_pos+2)
  2970.           =esc_check()
  2971.         ENDDO
  2972.       ENDSCAN
  2973.       IF .NOT.EMPTY(m.new_text)
  2974.         LOCATE
  2975.         IF ATC('FUNCTION '+m.str_data+m.cr_lf,m.cr_lf+PROCCODE+m.cr_lf)=0
  2976.           REPLACE PROCCODE WITH PROCCODE+m.new_text
  2977.         ELSE
  2978.           =warning(m.c_function+" '"+m.str_data+"' duplicated")
  2979.         ENDIF
  2980.       ENDIF
  2981.       LOCATE
  2982.       IF m.scnobj=='ON'.AND..NOT.wordsearch('#NOREAD',.T.)==m.null
  2983.         m.scnobj='OFF'
  2984.       ENDIF
  2985.       IF m.scnobj=='ON'
  2986.         GOTO m.r_scxdata
  2987.         LOCATE REST FOR BETWEEN(OBJTYPE,11,22)
  2988.         IF EOF()
  2989.           m.scnobj='OFF'
  2990.         ENDIF
  2991.       ENDIF
  2992.       IF m.scnobj=='ON'
  2993.         GOTO m.r_scxdata
  2994.         m.str_data='m.scnobj'+ALLTRIM(STR(m.scxcount,2))
  2995.         IF .NOT.UPPER(MLINE(NAME,1))==UPPER(m.str_data).AND.insrec(-1)
  2996.           REPLACE OBJTYPE WITH 20, OBJCODE WITH 1,;
  2997.                   NAME WITH m.str_data, EXPR WITH '',;
  2998.                   PICTURE WITH '"@*IHN "',;
  2999.                   WHENTYPE WITH 0, WHEN WITH '.F.',;
  3000.                   INITIALVAL WITH '', INITIALNUM WITH 0, COMMENT WITH ''
  3001.           IF _FOX25
  3002.             REPLACE FONTFACE WITH 'MS Sans Serif',;
  3003.                     FONTSTYLE WITH 0, FONTSIZE WITH 8
  3004.           ENDIF
  3005.         ENDIF
  3006.         GOTO BOTTOM
  3007.         IF .NOT.EMPTY(m.section3)
  3008.           SKIP -1
  3009.         ENDIF
  3010.         m.str_data='m.scnend'+ALLTRIM(STR(m.scxcount,2))
  3011.         IF .NOT.UPPER(MLINE(NAME,1))==UPPER(m.str_data).AND.insrec()
  3012.           REPLACE OBJTYPE WITH 20, OBJCODE WITH 1,;
  3013.                   NAME WITH m.str_data, EXPR WITH '',;
  3014.                   PICTURE WITH '"@*IHN "',;
  3015.                   WHENTYPE WITH 0, WHEN WITH '.F.',;
  3016.                   INITIALVAL WITH '', INITIALNUM WITH 0, COMMENT WITH ''
  3017.           IF _FOX25
  3018.             REPLACE FONTFACE WITH 'MS Sans Serif',;
  3019.                     FONTSTYLE WITH 0, FONTSIZE WITH 8
  3020.           ENDIF
  3021.         ENDIF
  3022.       ENDIF
  3023.       GOTO m.r_scxdata
  3024.     ENDIF
  3025.     m.match_drv=.F.
  3026.     IF m.gen_mode.AND.a_scxdrvs(8)>0
  3027.       m.drv_no=8
  3028.       FOR m.drv_cnt = 1 TO a_scxdrvs(8)
  3029.         IF ASCAN(a_drvoff,FULLPATH(a_scxdrv(m.drv_cnt,8)))>0
  3030.           LOOP
  3031.         ENDIF
  3032.         m.msg3='['+ALLTRIM(m.platform_)+'] '+trimpath(a_scxdrv(m.drv_cnt,8),.F.,.T.)
  3033.         DO delaybar WITH '',m.msg3,90*m.drv_cnt/a_scxdrvs(8)+5
  3034.         SCAN ALL FOR .NOT.DELETED()
  3035.           m.match_drv=.T.
  3036.           DO (a_scxdrv(m.drv_cnt,8))
  3037.           DO esc_check
  3038.         ENDSCAN
  3039.         LOCATE
  3040.         SCATTER MEMVAR MEMO
  3041.         DO restoreenv
  3042.       ENDFOR
  3043.     ENDIF
  3044.     IF m.match_drv
  3045.       DO delaybar WITH '',m.msg2,95
  3046.     ENDIF
  3047.     IF .NOT.m.gen_mode.AND..NOT.m.lib_mode
  3048.       EXIT
  3049.     ENDIF
  3050.     IF m.gen_mode
  3051.       m.i=0
  3052.       SCAN ALL FOR .NOT.DELETED()
  3053.         IF wordsearch(m.c_delobj)==m.null
  3054.           LOOP
  3055.         ENDIF
  3056.         m.i=m.i+1
  3057.         =delrec()
  3058.       ENDSCAN
  3059.       IF m.i>0
  3060.         DO packscx
  3061.       ENDIF
  3062.       IF m.r_scxdata>RECCOUNT()
  3063.         EXIT
  3064.       ENDIF
  3065.       LOCATE
  3066.       IF '*:'$SETUPCODE
  3067.         REPLACE SETUPCODE WITH STRTRAN(m.cr_lf+SETUPCODE,m.lf+'*:',m.lf+'*-:')
  3068.       ENDIF
  3069.       IF '*:'$SETUPCODE
  3070.         REPLACE SETUPCODE WITH STRTRAN(SETUPCODE,m.cr+'*:',m.cr+'*-:')
  3071.       ENDIF
  3072.     ENDIF
  3073.   ENDDO
  3074.   IF _WINDOWS.OR._MAC
  3075.     SET MESSAGE TO ' '
  3076.   ENDIF
  3077.   RELEASE a_scatter
  3078.   IF USED('SCXBASE')
  3079.     SCATTER MEMVAR MEMO BLANK
  3080.     USE IN SCXBASE
  3081.   ENDIF
  3082.   IF .NOT.USED('SCXDATA')
  3083.     EXIT
  3084.   ENDIF
  3085.   SELECT SCXDATA
  3086.   SET FILTER TO
  3087.   LOCATE
  3088.   IF .NOT.USED('PJXDATA')
  3089.     EXIT
  3090.   ENDIF
  3091.   IF m.comp_flag
  3092.     DO delaybar WITH '',m.msg2,100
  3093.   ENDIF
  3094.   SELECT PJXDATA
  3095.   m.fscxbase=STRTRAN(m.fscxbase,m.null,'')
  3096.   IF m.fromproj
  3097.     LOCATE FOR TYPE=='s'.AND.trimpath(STRTRAN(MLINE(NAME,1),;
  3098.                m.null,''))==trimpath(m.fscxbase)
  3099.   ELSE
  3100.     LOCATE FOR TYPE=='s'.AND.trimpath(FULLPATH(STRTRAN(STRTRAN(MLINE(NAME,1),;
  3101.                '..\',''),m.null,'')))==trimpath(m.fscxbase)
  3102.   ENDIF
  3103.   IF EOF()
  3104.     EXIT
  3105.   ENDIF
  3106.   IF .NOT.EMPTY(m.fscxdata)
  3107.     REPLACE NAME WITH FULLPATH(m.fscxdata,NAME)
  3108.   ENDIF
  3109.   REPLACE TIMESTAMP WITH -1
  3110.   LOCATE FOR TYPE=='s'.AND.TIMESTAMP>=0.AND.;
  3111.              ASCAN(a_scxalias,trimpath(STRTRAN(MLINE(NAME,1),CHR(0),'')))=0
  3112.   IF EOF()
  3113.     EXIT
  3114.   ENDIF
  3115.   m.screenset=.T.
  3116.   m.fscxdata=''
  3117.   IF _FOX25
  3118.     m.platform_=''
  3119.   ENDIF
  3120. ENDDO
  3121. m.platform_=PADR(m.cplatform_,8)
  3122. IF USED('PJXBASE')
  3123.   USE IN PJXBASE
  3124. ENDIF
  3125. IF USED('PJXDATA')
  3126.   USE IN PJXDATA
  3127. ENDIF
  3128. SELECT (m.lastslct)
  3129. IF m.comp_flag
  3130.   DO delaybar WITH '','',0,.T.
  3131. ENDIF
  3132. DO esc_check
  3133. RETURN .T.
  3134.  
  3135. * END genscx
  3136.  
  3137.  
  3138.  
  3139. FUNCTION updspr
  3140. PARAMETER m.projdbf,m.recno
  3141. PRIVATE memline,memline2,at_pos,at_pos2,at_pos3
  3142. PRIVATE lastslct,decimals,find_str,i,j,k,n,scx_no,ascstr
  3143. PRIVATE finsert,insfiles,inscount,inspos,fnameold,fnamenew
  3144. PRIVATE scx_alias,new_text,match,rplatform_,inserttop
  3145. PRIVATE winname,str_data,factor
  3146.  
  3147. IF .NOT.TYPE('a_scxalias')=='C'
  3148.   RETURN .F.
  3149. ENDIF
  3150. m.lastslct=SELECT()
  3151. FOR m.i = 1 TO m.screens
  3152.   IF USED(a_scxalias(m.i))
  3153.     USE IN (a_scxalias(m.i))
  3154.   ENDIF
  3155. ENDFOR
  3156. IF USED('SCXDATA')
  3157.   USE IN SCXDATA
  3158. ENDIF
  3159. IF USED('SPRDATA')
  3160.   SELECT SPRDATA
  3161.   USE
  3162. ENDIF
  3163. IF m.scxcount=0
  3164.   SELECT (m.lastslct)
  3165.   RETURN .F.
  3166. ENDIF
  3167. CREATE CURSOR SPRDATA (SPR M, INS M)
  3168. INSERT BLANK
  3169. APPEND MEMO SPR FROM (m.fsprout) OVERWRITE
  3170. FOR m.scx_no = 1 TO m.scxcount
  3171.   IF TYPE('a_fscxdata(m.scx_no)')=='C'
  3172.     m.fscxdata=a_fscxdata(m.scx_no)
  3173.   ENDIF
  3174.   m.fnameold=ALLTRIM(UPPER(trimpath(m.fscxdata,.T.)))
  3175.   m.fnamenew=PADL(UPPER(trimpath(m.fsprout,.T.)),LEN(m.fnameold))
  3176.   IF m.fnameold$SPR
  3177.     REPLACE SPR WITH STRTRAN(SPR,m.fnameold,m.fnamenew)
  3178.   ENDIF
  3179. ENDFOR
  3180. IF .NOT.m.ignrbraces.AND.'{{'$SPR
  3181.   REPLACE SPR WITH evltxt(SPR)
  3182. ENDIF
  3183. m.j=0
  3184. FOR m.i = 1 TO 6
  3185.   IF a_sprdrvs(m.i)>0
  3186.     m.j=m.i
  3187.     EXIT
  3188.   ENDIF
  3189. ENDFOR
  3190. IF .NOT.m.updsprflag.AND.m.j=0.AND.m.fnctnames=0.AND.;
  3191.    AT(m.lf+'@ -',SPR)=0.AND.ATC(m.p_insert,SPR)=0.AND.;
  3192.    ASCAN(a_scxupd,'*')=0.AND..NOT.m.c_insert$SPR.AND.;
  3193.    .NOT.m.c_section3$SPR
  3194.   COPY MEMO SPR TO (m.fsprout)
  3195.   SELECT (m.lastslct)
  3196.   RETURN .F.
  3197. ENDIF
  3198. IF _WINDOWS.OR._MAC
  3199.   m.fsprout=LOWER(m.fsprout)
  3200.   SET MESSAGE TO LEFT('Updating Screen Code: '+m.fsprout,79)
  3201. ELSE
  3202.   m.fsprout=UPPER(m.fsprout)
  3203. ENDIF
  3204. m.msg1='Updating Screen Code...'
  3205. m.msg2=m.fsprout
  3206. DO delaybar WITH m.msg1,m.msg2,0,.T.
  3207. DO esc_check
  3208. SELECT SPRDATA
  3209. IF a_sprdrvs(1)>0
  3210.   m.drv_no=-1
  3211.   FOR m.drv_cnt = 1 TO a_sprdrvs(1)
  3212.     IF ASCAN(a_drvoff,FULLPATH(a_sprdrv(m.drv_cnt,1)))>0
  3213.       LOOP
  3214.     ENDIF
  3215.     DO (a_sprdrv(m.drv_cnt,1))
  3216.     DO esc_check
  3217.     LOCATE
  3218.     DO restoreenv
  3219.   ENDFOR
  3220. ENDIF
  3221. SELECT SPRDATA
  3222. IF m.fnctnames>0
  3223.   FOR m.i = 1 TO m.fnctnames
  3224.     m.find_str=m.lf+'FUNCTION '+ALLTRIM(a_fnctname(m.i,1))+' '
  3225.     IF ATC(m.find_str,SPR)>0
  3226.       LOOP
  3227.     ENDIF
  3228.     m.memline=ALLTRIM(a_fnctname(m.i,2))
  3229.     REPLACE SPR WITH SPR+m.cr_lf+m.cr_lf+m.find_str+m.cr_lf+;
  3230.                      IIF(EMPTY(m.memline),'','PARAMETERS '+m.memline+;
  3231.                      m.cr_lf)+'RETURN .F.'+m.cr_lf
  3232.   ENDFOR
  3233. ENDIF
  3234. FOR m.scx_no = 1 TO m.scxcount
  3235.   m.factor=m.scx_no/m.scxcount
  3236.   IF USED('SCXDATA')
  3237.     SELECT SCXDATA
  3238.     USE
  3239.   ELSE
  3240.     SELECT 0
  3241.   ENDIF
  3242.   m.fscxdata=a_fscxdata(m.scx_no)
  3243.   USE (m.fscxdata) ALIAS SCXDATA
  3244.   SET FILTER TO .NOT.DELETED().AND.OBJTYPE#2.AND.OBJTYPE#10.AND.OBJTYPE#23
  3245.   LOCATE
  3246.   IF a_sprdrvs(2)>0
  3247.     m.drv_no=-2
  3248.     FOR m.drv_cnt = 1 TO a_sprdrvs(2)
  3249.       IF ASCAN(a_drvoff,FULLPATH(a_sprdrv(m.drv_cnt,2)))>0
  3250.         LOOP
  3251.       ENDIF
  3252.       m.msg3=trimpath(a_sprdrv(m.drv_cnt,2),.F.,.T.)
  3253.       DO delaybar WITH '',m.msg3,90*m.drv_cnt/a_sprdrvs(2)+5
  3254.       SCAN ALL
  3255.         DO (a_sprdrv(m.drv_cnt,2))
  3256.         DO esc_check
  3257.       ENDSCAN
  3258.       LOCATE
  3259.       SCATTER MEMVAR MEMO
  3260.       DO restoreenv
  3261.     ENDFOR
  3262.   ENDIF
  3263.   IF m.scx_no=1
  3264.     DO delaybar WITH '',m.msg2,5
  3265.   ENDIF
  3266.   SCAN ALL
  3267.     IF ATC(m.m_size,COMMENT)=0.AND.ATC(m.m_nosize,COMMENT)=0
  3268.       LOOP
  3269.     ENDIF
  3270.     IF m.scxcount=1
  3271.       DO delaybar WITH '','',20*RECNO()/RECCOUNT()
  3272.     ENDIF
  3273.     DO esc_check
  3274.     IF TYPE('PLATFORM')=='C'
  3275.       m.rplatform=ALLTRIM(PLATFORM)
  3276.     ELSE
  3277.       m.rplatform='DOS'
  3278.     ENDIF
  3279.     DO CASE
  3280.       CASE m.rplatform=='DOS'
  3281.         m.decimals=0
  3282.       CASE m.rplatform=='WINDOWS'
  3283.         m.decimals=3
  3284.       CASE m.rplatform=='MAC'
  3285.         m.decimals=3
  3286.       CASE m.rplatform=='UNIX'
  3287.         m.decimals=0
  3288.       OTHERWISE
  3289.         m.decimals=0
  3290.     ENDCASE
  3291.     FOR m.n = 1 TO IIF(REFRESH,2,1)
  3292.       FOR m.j = 1 TO 3
  3293.         DO CASE
  3294.           CASE m.j=1
  3295.             m.ascstr=' '
  3296.           CASE m.j=2
  3297.             m.ascstr=','
  3298.           OTHERWISE
  3299.             m.ascstr=''
  3300.         ENDCASE
  3301.         m.find_str='SIZE '+ALLTRIM(STR(m.scx_no+IIF(OBJTYPE#15.OR.;
  3302.                    OBJCODE#2,-100,800),4))+IIF(m.decimals=0,'','.'+;
  3303.                    REPLICATE('0',m.decimals))+','+;
  3304.                    ALLTRIM(STR(RECNO()+256,10,m.decimals))+m.ascstr
  3305.         m.i=ATCLINE(m.find_str,SPRDATA.SPR)
  3306.         IF m.i=0
  3307.           LOOP
  3308.         ENDIF
  3309.         m.at_pos=ATC(m.find_str,SPRDATA.SPR)
  3310.         _MLINE=m.at_pos-5
  3311.         m.memline=MLINE(SPRDATA.SPR,1,_MLINE)
  3312.         m.memline=MLINE(SPRDATA.SPR,1,_MLINE)
  3313.         m.k=0
  3314.         IF EMPTY(SHOW)
  3315.           IF RIGHT(m.memline,1)==';'
  3316.             m.memline=m.memline+m.cr_lf
  3317.           ELSE
  3318.             m.memline=';'+m.cr_lf+m.memline+m.cr_lf
  3319.             m.at_pos=m.at_pos-OCCURS(CHR(9),m.memline)-3
  3320.             m.k=1
  3321.           ENDIF
  3322.         ELSE
  3323.           m.memline=STRTRAN(m.memline,CHR(9),'')
  3324.           IF RIGHT(m.memline,1)==';'
  3325.             m.memline=LEFT(m.memline,LEN(m.memline)-1)
  3326.           ENDIF
  3327.         ENDIF
  3328.         m.new_text=IIF(EMPTY(SHOW),'',ALLTRIM(MLINE(SHOW,1))+' ')+;
  3329.                    IIF(m.k=0,'',m.cr_lf)
  3330.         REPLACE SPRDATA.SPR WITH LEFT(SPRDATA.SPR,m.at_pos-1)+m.new_text+;
  3331.                                  SUBSTR(SPRDATA.SPR,m.at_pos+LEN(m.memline))
  3332.         EXIT
  3333.       ENDFOR
  3334.     ENDFOR
  3335.   ENDSCAN
  3336.   m.match=.F.
  3337.   IF a_sprdrvs(3)>0
  3338.     m.drv_no=-3
  3339.     FOR m.drv_cnt = 1 TO a_sprdrvs(3)
  3340.       IF ASCAN(a_drvoff,FULLPATH(a_sprdrv(m.drv_cnt,3)))>0
  3341.         LOOP
  3342.       ENDIF
  3343.       m.msg3=trimpath(a_sprdrv(m.drv_cnt,3),.F.,.T.)
  3344.       DO delaybar WITH '',m.msg3,90*m.drv_cnt/a_sprdrvs(3)+5
  3345.       SCAN ALL
  3346.         m.match=.T.
  3347.         DO (a_sprdrv(m.drv_cnt,3))
  3348.         DO esc_check
  3349.       ENDSCAN
  3350.       LOCATE
  3351.       SCATTER MEMVAR MEMO
  3352.       DO restoreenv
  3353.     ENDFOR
  3354.   ENDIF
  3355.   IF m.match.AND.m.scxcount=1
  3356.     DO delaybar WITH '',m.msg2,50
  3357.   ENDIF
  3358.   SCAN ALL
  3359.     IF ATC(m.m_instxt,COMMENT)=0
  3360.       LOOP
  3361.     ENDIF
  3362.     IF m.scxcount=1
  3363.       DO delaybar WITH '','',70*RECNO()/RECCOUNT()+20
  3364.     ENDIF
  3365.     DO esc_check
  3366.     IF TYPE('PLATFORM')=='C'
  3367.       m.rplatform=ALLTRIM(PLATFORM)
  3368.     ELSE
  3369.       m.rplatform='DOS'
  3370.     ENDIF
  3371.     DO CASE
  3372.       CASE m.rplatform=='DOS'
  3373.         m.decimals=0
  3374.       CASE m.rplatform=='WINDOWS'
  3375.         m.decimals=3
  3376.       CASE m.rplatform=='MAC'
  3377.         m.decimals=3
  3378.       CASE m.rplatform=='UNIX'
  3379.         m.decimals=0
  3380.       OTHERWISE
  3381.         m.decimals=0
  3382.     ENDCASE
  3383.     FOR m.n = 1 TO IIF(REFRESH,2,1)
  3384.       m.find_str='@ '+ALLTRIM(STR(-m.scx_no,4))+IIF(m.decimals=0,'','.'+;
  3385.                  REPLICATE('0',m.decimals))
  3386.       m.find_str=m.find_str+','+ALLTRIM(STR(RECNO()+256,10,m.decimals))+' '
  3387.       m.i=ATCLINE(m.find_str,SPRDATA.SPR)
  3388.       IF m.i=0
  3389.         LOOP
  3390.       ENDIF
  3391.       m.at_pos=ATC(m.find_str,SPRDATA.SPR)
  3392.       _MLINE=m.at_pos-5
  3393.       m.memline=MLINE(SPRDATA.SPR,1,_MLINE)
  3394.       m.memline=MLINE(SPRDATA.SPR,1,_MLINE)+m.cr_lf
  3395.       FOR m.j = 1 TO 5
  3396.         m.memline2=ALLTRIM(MLINE(SPRDATA.SPR,1,_MLINE))
  3397.         IF INLIST(UPPER(LEFT(STRTRAN(m.memline2,CHR(9),''),4)),'SIZE','PEN ',;
  3398.                   'STYL','FONT','COLO')
  3399.           m.memline=m.memline+m.memline2+m.cr_lf
  3400.         ELSE
  3401.           EXIT
  3402.         ENDIF
  3403.       ENDFOR
  3404.       m.find_str=m.m_instxt
  3405.       m.str_data=wordsearch(m.find_str)
  3406.       IF m.str_data=m.null
  3407.         m.str_data=''
  3408.       ENDIF
  3409.       m.at_pos2=ATC(m.find_str,COMMENT)
  3410.       IF m.at_pos2=0
  3411.         m.new_text=''
  3412.       ELSE
  3413.         m.memline2=ALLTRIM(SUBSTR(COMMENT,m.at_pos2+LEN(m.find_str)+;
  3414.                    LEN(m.str_data)+1))
  3415.         m.at_pos3=ATC(m.c_endtxt,m.memline2)
  3416.         IF m.at_pos3>0
  3417.           m.memline2=LEFT(m.memline2,m.at_pos3-1)
  3418.         ENDIF
  3419.         DO WHILE LEFT(m.memline2,1)==m.cr.OR.LEFT(m.memline2,1)==m.lf
  3420.           m.memline2=SUBSTR(m.memline2,2)
  3421.         ENDDO
  3422.         DO WHILE RIGHT(m.memline2,1)==m.cr.OR.RIGHT(m.memline2,1)==m.lf
  3423.           m.memline2=LEFT(m.memline2,LEN(m.memline2)-1)
  3424.         ENDDO
  3425.         IF m.outtxt=='ON'
  3426.           m.new_text=m.cr+'** Start of inserted text'+m.cr+;
  3427.                      m.memline2+m.cr+m.cr+'** End of inserted text'+m.cr
  3428.         ELSE
  3429.           m.new_text=m.memline2+SPACE(5)+m.cr
  3430.         ENDIF
  3431.       ENDIF
  3432.       REPLACE SPRDATA.SPR WITH LEFT(SPRDATA.SPR,m.at_pos-1)+m.new_text+;
  3433.                                SUBSTR(SPRDATA.SPR,m.at_pos+LEN(m.memline)-1)
  3434.     ENDFOR
  3435.   ENDSCAN
  3436.   SELECT SPRDATA
  3437.   FOR m.i = 1 TO 4
  3438.     m.str_data=a_nowclaus(m.scx_no,m.i)
  3439.     IF EMPTY(m.str_data)
  3440.       LOOP
  3441.     ENDIF
  3442.     m.winname=ALLTRIM(LEFT(m.str_data,11))
  3443.     m.str_data=UPPER(ALLTRIM(SUBSTR(m.str_data,12)))
  3444.     IF EMPTY(m.winname).OR.EMPTY(m.str_data)
  3445.       LOOP
  3446.     ENDIF
  3447.     m.at_pos3=ATC('DEFINE WINDOW '+m.winname+' ',SPR)
  3448.     IF m.at_pos3=0
  3449.       =warning(m.c_nowclaus+" 'DEFINE WINDOW "+m.winname+"' not found")
  3450.       LOOP
  3451.     ENDIF
  3452.     m.memline=SUBSTR(SPR,m.at_pos3,2048)
  3453.     m.new_text=''
  3454.     DO WHILE .T.
  3455.       m.at_pos=AT(m.cr_lf,m.memline)
  3456.       IF m.at_pos<2
  3457.         EXIT
  3458.       ENDIF
  3459.       m.new_text=m.new_text+LEFT(m.memline,m.at_pos+1)
  3460.       IF .NOT.SUBSTR(m.memline,m.at_pos-1,1)==';'.OR.;
  3461.          AT(CHR(9)+'COLOR',LEFT(m.memline,m.at_pos+1))>0
  3462.         EXIT
  3463.       ENDIF
  3464.       m.memline=SUBSTR(m.memline,m.at_pos+2)
  3465.     ENDDO
  3466.     m.memline=m.new_text
  3467.     DO WHILE .T.
  3468.       m.at_pos=AT(' ',m.str_data)
  3469.       DO CASE
  3470.         CASE EMPTY(m.str_data)
  3471.           EXIT
  3472.         CASE m.at_pos=0
  3473.           m.find_str=ALLTRIM(m.str_data)
  3474.           m.str_data=''
  3475.         OTHERWISE
  3476.           m.find_str=ALLTRIM(LEFT(m.str_data,m.at_pos-1))
  3477.           m.str_data=ALLTRIM(SUBSTR(m.str_data,m.at_pos+1))
  3478.       ENDCASE
  3479.       IF m.find_str=='COLOR'
  3480.         LOOP
  3481.       ENDIF
  3482.       m.find_str=CHR(9)+m.find_str+' '
  3483.       m.at_pos=AT(m.find_str,m.new_text)
  3484.       IF m.at_pos=0
  3485.         LOOP
  3486.       ENDIF
  3487.       m.at_pos2=m.at_pos
  3488.       DO WHILE .NOT.SUBSTR(m.new_text,m.at_pos,1)==';'
  3489.         m.at_pos=m.at_pos-1
  3490.         IF m.at_pos<=0
  3491.           EXIT
  3492.         ENDIF
  3493.       ENDDO
  3494.       DO WHILE .NOT.SUBSTR(m.new_text,m.at_pos2,1)==';'
  3495.         m.at_pos2=m.at_pos2+1
  3496.         IF m.at_pos2>=LEN(m.new_text)
  3497.           EXIT
  3498.         ENDIF
  3499.       ENDDO
  3500.       m.new_text=LEFT(m.new_text,m.at_pos)+SUBSTR(m.new_text,m.at_pos2+1)
  3501.     ENDDO
  3502.     REPLACE SPR WITH strtranc(LEFT(SPR,m.at_pos3-1)+m.new_text+;
  3503.                      SUBSTR(SPR,m.at_pos3+LEN(m.memline)),m.winname,;
  3504.                      ALLTRIM(LEFT(m.winname,10)))
  3505.   ENDFOR
  3506.   SELECT SCXDATA
  3507.   IF a_sprdrvs(4)>0
  3508.     m.drv_no=-4
  3509.     FOR m.drv_cnt = 1 TO a_sprdrvs(4)
  3510.       IF ASCAN(a_drvoff,FULLPATH(a_sprdrv(m.drv_cnt,4)))>0
  3511.         LOOP
  3512.       ENDIF
  3513.       m.msg3=trimpath(a_sprdrv(m.drv_cnt,4),.F.,.T.)
  3514.       DO delaybar WITH '',m.msg3,90*m.drv_cnt/a_sprdrvs(4)+5
  3515.       SCAN ALL
  3516.         DO (a_sprdrv(m.drv_cnt,4))
  3517.         DO esc_check
  3518.       ENDSCAN
  3519.       LOCATE
  3520.       SCATTER MEMVAR MEMO
  3521.       DO restoreenv
  3522.     ENDFOR
  3523.   ENDIF
  3524.   DO delaybar WITH '','',90*m.factor
  3525.   IF USED('SCXDATA')
  3526.     SELECT SCXDATA
  3527.     USE
  3528.   ENDIF
  3529. ENDFOR
  3530. SELECT SPRDATA
  3531. m.match=.F.
  3532. IF a_sprdrvs(5)>0
  3533.   m.drv_no=-5
  3534.   FOR m.drv_cnt = 1 TO a_sprdrvs(5)
  3535.     IF ASCAN(a_drvoff,FULLPATH(a_sprdrv(m.drv_cnt,5)))>0
  3536.       LOOP
  3537.     ENDIF
  3538.     m.msg3=trimpath(a_sprdrv(m.drv_cnt,5),.F.,.T.)
  3539.     DO delaybar WITH '',m.msg3,90*m.drv_cnt/a_sprdrvs(5)+5
  3540.     SCAN ALL
  3541.       m.match=.T.
  3542.       DO (a_sprdrv(m.drv_cnt,5))
  3543.       DO esc_check
  3544.     ENDSCAN
  3545.     LOCATE
  3546.     SCATTER MEMVAR MEMO
  3547.     DO restoreenv
  3548.   ENDFOR
  3549. ENDIF
  3550. IF m.match
  3551.   DO delaybar WITH '',m.msg2,90
  3552. ENDIF
  3553. DIMENSION a_insfile(1)
  3554. m.insfiles=0
  3555. m.at_pos2=1
  3556. FOR m.k = 1 TO 2
  3557.   m.find_str=IIF(m.k=1,m.c_insert,m.p_insert)
  3558.   DO WHILE .T.
  3559.     DO esc_check
  3560.     m.at_pos=ATC(m.find_str,SUBSTR(SPR,m.at_pos2))
  3561.     IF m.at_pos=0
  3562.       EXIT
  3563.     ENDIF
  3564.     m.at_pos=m.at_pos+m.at_pos2-1
  3565.     m.inserttop=(m.k=1.AND.UPPER(SUBSTR(SPR,m.at_pos,11))==m.c_insert+'TOP')
  3566.     m.at_pos=m.at_pos-2
  3567.     m.ascstr=ASC(SUBSTR(SPR,m.at_pos-1,1))
  3568.     IF m.ascstr=10.OR.m.ascstr=13
  3569.       m.at_pos=m.at_pos-1
  3570.     ENDIF
  3571.     m.j=LEN(m.find_str)
  3572.     FOR m.i = 1 TO 2
  3573.       IF EMPTY(SUBSTR(SPR,m.at_pos+m.i,1))
  3574.         EXIT
  3575.       ENDIF
  3576.       m.j=m.j+1
  3577.     ENDFOR
  3578.     m.at_pos3=0
  3579.     FOR m.i = -m.j TO m.j
  3580.       m.memline=MLINE(SPR,1,m.at_pos)
  3581.       m.at_pos3=ATC(m.find_str,m.memline)
  3582.       IF m.at_pos3>0
  3583.         EXIT
  3584.       ENDIF
  3585.       m.at_pos=m.at_pos+1
  3586.     ENDFOR
  3587.     m.memline2=IIF(m.at_pos3>0,ALLTRIM(STRTRAN(m.memline,CHR(9),' ')),'')
  3588.     IF ATC(m.find_str,m.memline2)#1
  3589.       m.at_pos2=m.at_pos+LEN(m.memline)+2
  3590.       LOOP
  3591.     ENDIF
  3592.     IF m.ascstr=10.OR.m.ascstr=13
  3593.       m.memline=m.memline+' '
  3594.     ENDIF
  3595.     m.at_pos=m.at_pos+1
  3596.     m.j=0
  3597.     FOR m.i = 1 TO 256
  3598.       m.ascstr=ASC(SUBSTR(SPR,m.at_pos-m.i,1))
  3599.       IF m.ascstr=10.OR.m.ascstr=13.OR.(m.at_pos-m.i)<=0
  3600.         EXIT
  3601.       ENDIF
  3602.       m.j=-1
  3603.     ENDFOR
  3604.     IF m.j=-1.OR.m.i>256
  3605.       m.at_pos2=m.at_pos+LEN(m.memline)+2
  3606.       LOOP
  3607.     ENDIF
  3608.     m.finsert=ALLTRIM(SUBSTR(m.memline2,AT(' ',m.memline2)))
  3609.     DO WHILE RIGHT(m.finsert,1)==m.cr.OR.RIGHT(m.finsert,1)==m.lf
  3610.       m.finsert=LEFT(m.finsert,LEN(m.finsert)-1)
  3611.     ENDDO
  3612.     IF FILE(m.finsert)
  3613.       m.inscount=0
  3614.       m.inspos=ASCAN(a_insfile,m.finsert)
  3615.       DO WHILE m.inspos>0.AND.m.inscount<256
  3616.         m.inscount=m.inscount+1
  3617.         m.inspos=ASCAN(a_insfile,m.finsert,m.inspos+1)
  3618.       ENDDO
  3619.       IF m.inscount>256
  3620.         REPLACE SPR WITH LEFT(SPR,m.at_pos-1)+'*'+SUBSTR(SPR,m.at_pos)
  3621.         m.at_pos2=m.at_pos+LEN(m.memline)+2
  3622.         LOOP
  3623.       ENDIF
  3624.       m.insfiles=m.insfiles+1
  3625.       DIMENSION a_insfile(m.insfiles)
  3626.       a_insfile(m.insfiles)=m.finsert
  3627.       APPEND MEMO INS FROM (m.finsert) OVERWRITE
  3628.       m.new_text=INS
  3629.       m.new_text='** Start of inserted file '+m.finsert+;
  3630.                  ' ────────────────────────────────start'+m.cr_lf+;
  3631.                  m.new_text+m.cr_lf+'** End of inserted file '+;
  3632.                  m.finsert+' ────────────────────────────────────end'+;
  3633.                  m.cr_lf
  3634.     ELSE
  3635.       =warning(m.c_insert,m.finsert)
  3636.       m.new_text='*'+m.cr_lf+'* Inserted file '+m.finsert+' not found!'+;
  3637.                  cr_lf+'*'+m.cr_lf
  3638.     ENDIF
  3639.     m.i=LEN(m.memline)
  3640.     IF m.inserttop
  3641.       m.memline=ALLTRIM(m.memline)+m.cr_lf
  3642.       REPLACE SPR WITH LEFT(SPR,m.at_pos-1)+m.cr_lf+;
  3643.                        strtranc(SUBSTR(SPR,m.at_pos+m.i+1),m.memline,m.cr_lf)
  3644.       m.at_pos3=ATC(m.cr_lf+m.cr_lf,SPR)
  3645.       IF m.at_pos3=0.OR.m.at_pos3>=m.at_pos.OR.;
  3646.          (m.at_pos3>=ATC(m.cr_lf+'DO CASE',SPR).AND.;
  3647.          m.at_pos3>=ATC(m.cr_lf+'#REGION 1',SPR))
  3648.         m.at_pos3=1
  3649.       ELSE
  3650.         m.at_pos3=m.at_pos3+2
  3651.       ENDIF
  3652.       REPLACE SPR WITH LEFT(SPR,m.at_pos3-1)+m.cr_lf+m.new_text+;
  3653.                        SUBSTR(SPR,m.at_pos3)
  3654.       m.at_pos2=1
  3655.     ELSE
  3656.       REPLACE SPR WITH LEFT(SPR,m.at_pos-1)+m.new_text+;
  3657.                        SUBSTR(SPR,m.at_pos+m.i+1)
  3658.     ENDIF
  3659.   ENDDO
  3660. ENDFOR
  3661. DO delaybar WITH '','',95
  3662. IF .NOT.m.ignrbraces.AND.'{{'$SPR
  3663.   REPLACE SPR WITH evltxt(SPR)
  3664. ENDIF
  3665. m.match=.F.
  3666. IF a_sprdrvs(6)>0
  3667.   m.drv_no=-6
  3668.   FOR m.drv_cnt = 1 TO a_sprdrvs(6)
  3669.     IF ASCAN(a_drvoff,FULLPATH(a_sprdrv(m.drv_cnt,6)))>0
  3670.       LOOP
  3671.     ENDIF
  3672.     m.msg3=trimpath(a_sprdrv(m.drv_cnt,6),.F.,.T.)
  3673.     DO delaybar WITH '',m.msg3,90*m.drv_cnt/a_sprdrvs(6)+5
  3674.     SCAN ALL
  3675.       m.match=.T.
  3676.       DO (a_sprdrv(m.drv_cnt,6))
  3677.       DO esc_check
  3678.     ENDSCAN
  3679.     LOCATE
  3680.     SCATTER MEMVAR MEMO
  3681.     DO restoreenv
  3682.   ENDFOR
  3683. ENDIF
  3684. IF m.match
  3685.   DO delaybar WITH '',m.msg2,95
  3686. ENDIF
  3687. COPY MEMO SPR TO (m.fsprout)
  3688. DO delaybar WITH '','',100
  3689. IF _WINDOWS.OR._MAC
  3690.   SET MESSAGE TO ' '
  3691. ENDIF
  3692. SELECT (m.lastslct)
  3693. DO delaybar WITH '','',0,.T.
  3694. DO esc_check
  3695. RETURN .T.
  3696.  
  3697. * END updspr
  3698.  
  3699.  
  3700.  
  3701. FUNCTION openfoxscx
  3702. PRIVATE i,configfile
  3703.  
  3704. IF USED('FOXSCX')
  3705.   SELECT FOXSCX
  3706.   LOCATE
  3707.   RETURN .T.
  3708. ENDIF
  3709. IF FILE(m.ffoxscx)
  3710.   SELECT 0
  3711.   USE (m.ffoxscx) ALIAS FOXSCX
  3712.   IF (.NOT._FOX25.OR..NOT.USED('SCXBASE').OR.;
  3713.      FCOUNT('SCXBASE')=(FCOUNT()-m.fcountadj)).AND.;
  3714.      LEN(OBJFIELD_)=24
  3715.     USE
  3716.   ELSE
  3717.     m.ffoxscx2=FULLPATH(uniqueflnm(),m.ffoxscx)
  3718.     SELECT * FROM FOXSCX INTO TABLE (m.ffoxscx2)
  3719.     USE
  3720.     SELECT FOXSCX
  3721.     USE
  3722.     =erasedbf(m.ffoxscx,'FOXSCX')
  3723.   ENDIF
  3724. ENDIF
  3725. IF FILE(m.ffoxscx).OR..NOT.USED('SCXBASE')
  3726.   IF USED('FOXSCX')
  3727.     SELECT FOXSCX
  3728.   ELSE
  3729.     IF .NOT.FILE(m.ffoxscx)
  3730.       RETURN .F.
  3731.     ENDIF
  3732.     SELECT 0
  3733.     USE (m.ffoxscx) ALIAS FOXSCX
  3734.   ENDIF
  3735. ELSE
  3736.   SELECT SCXBASE
  3737.   m.i=AFIELDS(a_fscatter)
  3738.   IF .NOT._FOX25
  3739.     m.i=AFIELDS(a_fscatter)
  3740.     DIMENSION a_fscatter(m.i+1,4)
  3741.     a_fscatter(m.i+1,1)='PLATFORM'
  3742.     a_fscatter(m.i+1,2)='C'
  3743.     a_fscatter(m.i+1,3)=8
  3744.     a_fscatter(m.i+1,4)=0
  3745.     m.i=m.i+1
  3746.   ENDIF
  3747.   DIMENSION a_fscatter(m.i+8,4)
  3748.   a_fscatter(m.i+1,1)='OBJNAME_'
  3749.   a_fscatter(m.i+1,2)='C'
  3750.   a_fscatter(m.i+1,3)=24
  3751.   a_fscatter(m.i+1,4)=0
  3752.   a_fscatter(m.i+2,1)='OBJBASE_'
  3753.   a_fscatter(m.i+2,2)='C'
  3754.   a_fscatter(m.i+2,3)=35
  3755.   a_fscatter(m.i+2,4)=0
  3756.   a_fscatter(m.i+3,1)='OBJFIELD_'
  3757.   a_fscatter(m.i+3,2)='C'
  3758.   a_fscatter(m.i+3,3)=24
  3759.   a_fscatter(m.i+3,4)=0
  3760.   a_fscatter(m.i+4,1)='OBJLIB_'
  3761.   a_fscatter(m.i+4,2)='C'
  3762.   a_fscatter(m.i+4,3)=10
  3763.   a_fscatter(m.i+4,4)=0
  3764.   a_fscatter(m.i+5,1)='OBJSCX_'
  3765.   a_fscatter(m.i+5,2)='C'
  3766.   a_fscatter(m.i+5,3)=8
  3767.   a_fscatter(m.i+5,4)=0
  3768.   a_fscatter(m.i+6,1)='OBJFLAG_'
  3769.   a_fscatter(m.i+6,2)='L'
  3770.   a_fscatter(m.i+6,3)=1
  3771.   a_fscatter(m.i+6,4)=0
  3772.   a_fscatter(m.i+7,1)='OBJCMNT_'
  3773.   a_fscatter(m.i+7,2)='M'
  3774.   a_fscatter(m.i+7,3)=10
  3775.   a_fscatter(m.i+7,4)=0
  3776.   a_fscatter(m.i+8,1)='OBJMEMO_'
  3777.   a_fscatter(m.i+8,2)='M'
  3778.   a_fscatter(m.i+8,3)=10
  3779.   a_fscatter(m.i+8,4)=0
  3780.   CREATE DBF (m.ffoxscx) FROM ARRAY a_fscatter
  3781.   USE
  3782.   RELEASE a_fscatter
  3783.   SELECT 0
  3784.   USE (m.ffoxscx) ALIAS FOXSCX
  3785.   IF FILE(m.ffoxscx2+'.DBF')
  3786.     APPEND FROM (m.ffoxscx2)
  3787.     =erasedbf(m.ffoxscx2,m.ffoxscx2)
  3788.   ENDIF
  3789. ENDIF
  3790. SELECT FOXSCX
  3791. m.i=0
  3792. IF .NOT.TAG(1)=='OBJNAME_'.OR..NOT.KEY(1)=='UPPER(OBJNAME_)+OBJLIB_'
  3793.   m.i=1
  3794. ENDIF
  3795. IF .NOT.TAG(2)=='OBJBASE_'.OR..NOT.KEY(2)=='OBJBASE_+OBJLIB_'
  3796.   m.i=2
  3797. ENDIF
  3798. IF .NOT.TAG(3)=='OBJFIELD_'.OR..NOT.KEY(3)=='OBJFIELD_+OBJLIB_'
  3799.   m.i=3
  3800. ENDIF
  3801. IF .NOT.TAG(4)=='OBJLIB_'.OR..NOT.KEY(4)=='OBJLIB_+UPPER(OBJNAME_)'
  3802.   m.i=4
  3803. ENDIF
  3804. IF .NOT.TAG(5)=='OBJSCX_'.OR..NOT.KEY(5)=='OBJSCX_+OBJLIB_+UPPER(OBJNAME_)'
  3805.   m.i=5
  3806. ENDIF
  3807. IF m.i>0
  3808.   DELETE TAG ALL
  3809.   INDEX ON UPPER(OBJNAME_)+OBJLIB_ TAG OBJNAME_
  3810.   INDEX ON OBJBASE_+OBJLIB_ TAG OBJBASE_
  3811.   INDEX ON OBJFIELD_+OBJLIB_ TAG OBJFIELD_
  3812.   INDEX ON OBJLIB_+UPPER(OBJNAME_) TAG OBJLIB_
  3813.   INDEX ON OBJSCX_+OBJLIB_+UPPER(OBJNAME_) TAG OBJSCX_
  3814. ENDIF
  3815. IF EMPTY(FILTER()).AND.TYPE('PLATFORM')=='C'
  3816.   IF TYPE('m.platform_')#'C'.OR.EMPTY(m.platform_)
  3817.     SET FILTER TO PLATFORM==m.cplatform_
  3818.   ELSE
  3819.     SET FILTER TO PLATFORM==m.platform_
  3820.   ENDIF
  3821. ENDIF
  3822. LOCATE
  3823. RETURN .T.
  3824.  
  3825. * END openfoxscx
  3826.  
  3827.  
  3828.  
  3829. FUNCTION strtranc
  3830. PARAMETERS expc1,expc2,expc3,expn1,expn2
  3831. PRIVATE expr,at_pos,at_pos2,i,j
  3832.  
  3833. IF EMPTY(m.expc1).OR.EMPTY(m.expc2)
  3834.   RETURN m.expc1
  3835. ENDIF
  3836. m.expr=m.expc1
  3837. IF TYPE('m.expn1')#'N'
  3838.   m.expn1=1
  3839. ENDIF
  3840. IF TYPE('m.expn2')#'N'
  3841.   m.expn2=LEN(m.expc1)
  3842. ENDIF
  3843. IF m.expn1<1.OR.m.expn2<1
  3844.   RETURN m.expc1
  3845. ENDIF
  3846. m.i=0
  3847. m.j=0
  3848. m.at_pos2=1
  3849. DO WHILE .T.
  3850.   m.at_pos=ATC(m.expc2,SUBSTR(m.expr,m.at_pos2))
  3851.   IF m.at_pos=0
  3852.     EXIT
  3853.   ENDIF
  3854.   m.i=m.i+1
  3855.   IF m.i<m.expn1
  3856.     m.at_pos2=m.at_pos+m.at_pos2+LEN(m.expc2)-1
  3857.     LOOP
  3858.   ENDIF
  3859.   m.expr=LEFT(m.expr,m.at_pos+m.at_pos2-2)+m.expc3+;
  3860.          SUBSTR(m.expr,m.at_pos+m.at_pos2+LEN(m.expc2)-1)
  3861.   m.j=m.j+1
  3862.   IF m.j>=m.expn2
  3863.     EXIT
  3864.   ENDIF
  3865.   m.at_pos2=m.at_pos+m.at_pos2+LEN(m.expc3)-1
  3866.   IF m.at_pos2>LEN(m.expr)
  3867.     EXIT
  3868.   ENDIF
  3869. ENDDO
  3870. RETURN m.expr
  3871.  
  3872. * END strtranc
  3873.  
  3874.  
  3875.  
  3876. FUNCTION nobrackets
  3877. PARAMETER expc
  3878.  
  3879. IF .NOT.'['$m.expc.OR..NOT.']'$m.expc
  3880.   RETURN m.expc
  3881. ENDIF
  3882. RETURN STRTRAN(STRTRAN(m.expc,'[','('),']',')')
  3883.  
  3884. * END nobrackets
  3885.  
  3886.  
  3887.  
  3888. FUNCTION linesearch
  3889. PARAMETERS find_str,searchfld
  3890.  
  3891. RETURN wordsearch(m.find_str,m.searchfld,.T.)
  3892.  
  3893. * END linesearch
  3894.  
  3895.  
  3896.  
  3897. FUNCTION wordsearch
  3898. PARAMETERS find_str,searchfld,ignoreword
  3899. PRIVATE memdata,memline,str_data,i,lastmline
  3900.  
  3901. IF TYPE('m.null')#'C'
  3902.   m.null=CHR(0)
  3903. ENDIF
  3904. IF TYPE('m.cr')#'C'
  3905.   m.cr=CHR(13)
  3906. ENDIF
  3907. IF TYPE('m.lf')#'C'
  3908.   m.lf=CHR(10)
  3909. ENDIF
  3910. IF PARAMETERS()=1
  3911.   m.searchfld=(OBJTYPE=1)
  3912. ENDIF
  3913. DO CASE
  3914.   CASE TYPE('m.searchfld')=='L'
  3915.     IF m.searchfld
  3916.       IF EMPTY(SETUPCODE)
  3917.         RETURN m.null
  3918.       ENDIF
  3919.       m.memdata=SETUPCODE
  3920.     ELSE
  3921.       IF EMPTY(COMMENT)
  3922.         RETURN m.null
  3923.       ENDIF
  3924.       m.memdata=COMMENT
  3925.     ENDIF
  3926.   CASE TYPE('m.searchfld')=='C'
  3927.     m.memdata=EVALUATE(m.searchfld)
  3928.     IF EMPTY(m.searchfld)
  3929.       RETURN m.null
  3930.     ENDIF
  3931.   OTHERWISE
  3932.     RETURN m.null
  3933. ENDCASE
  3934. m.lastmline=_MLINE
  3935. m.memdata=m.lf+m.memdata
  3936. _MLINE=ATC(m.lf+m.find_str,m.memdata)
  3937. IF _MLINE=0
  3938.   m.memdata=m.cr+SUBSTR(m.memdata,2)
  3939.   _MLINE=ATC(m.cr+m.find_str,m.memdata)
  3940.   IF _MLINE=0
  3941.     _MLINE=m.lastmline
  3942.     RETURN m.null
  3943.   ENDIF
  3944. ENDIF
  3945. DO WHILE _MLINE<LEN(m.memdata)
  3946.   m.memline=ALLTRIM(MLINE(m.memdata,1,_MLINE))
  3947.   m.str_data=SUBSTR(m.memline,LEN(m.find_str)+1,1)
  3948.   IF ATC(m.find_str,m.memline)#1.OR.(.NOT.m.ignoreword.AND.;
  3949.      .NOT.EMPTY(m.str_data).AND..NOT.m.str_data==''))
  3950.     m.memdata=m.lf+SUBSTR(m.memdata,_MLINE)
  3951.     _MLINE=ATC(m.lf+m.find_str,m.memdata)
  3952.     IF _MLINE=0
  3953.       m.memdata=m.cr+SUBSTR(m.memdata,2)
  3954.       _MLINE=ATC(m.cr+m.find_str,m.memdata)
  3955.       IF _MLINE=0
  3956.         EXIT
  3957.       ENDIF
  3958.     ENDIF
  3959.     LOOP
  3960.   ENDIF
  3961.   _MLINE=m.lastmline
  3962.   RETURN ALLTRIM(SUBSTR(m.memline,LEN(m.find_str)+1))
  3963. ENDDO
  3964. _MLINE=m.lastmline
  3965. RETURN m.null
  3966.  
  3967. * END wordsearch
  3968.  
  3969.  
  3970.  
  3971. FUNCTION erasedbf
  3972. PARAMETERS dbf_name,dbf_alias
  3973. PRIVATE ferase
  3974.  
  3975. IF USED(m.dbf_alias)
  3976.   USE IN (m.dbf_alias)
  3977. ENDIF
  3978. m.dbf_name=trimext(m.dbf_name)
  3979. m.ferase=m.dbf_name+'.DBF'
  3980. IF FILE(m.ferase)
  3981.   ERASE (m.ferase)
  3982. ENDIF
  3983. m.ferase=m.dbf_name+'.FPT'
  3984. IF FILE(m.ferase)
  3985.   ERASE (m.ferase)
  3986. ENDIF
  3987. RETURN .T.
  3988.  
  3989. * END erasedbf
  3990.  
  3991.  
  3992.  
  3993. FUNCTION packscx
  3994. PRIVATE lastfilter,r
  3995.  
  3996. m.lastfilter=FILTER()
  3997. SET FILTER TO
  3998. GOTO m.r_scxdata
  3999. SCAN REST FOR OBJTYPE#1.AND.DELETED()
  4000.   m.r=RECNO()
  4001.   SCAN REST FOR .NOT.DELETED().AND.(VPOS<0.OR.HEIGHT<0.OR.;
  4002.                 HEIGHT>=256)
  4003.     IF VPOS<0
  4004.       REPLACE HPOS WITH HPOS-1
  4005.     ENDIF
  4006.     IF HEIGHT<0.OR.HEIGHT>=256
  4007.       REPLACE WIDTH WITH WIDTH-1
  4008.     ENDIF
  4009.   ENDSCAN
  4010.   GOTO m.r
  4011. ENDSCAN
  4012. PACK
  4013. IF EMPTY(m.lastfilter)
  4014.   SET FILTER TO
  4015. ELSE
  4016.   SET FILTER TO &lastfilter
  4017. ENDIF
  4018. LOCATE
  4019. RETURN .T.
  4020.  
  4021. * END packscx
  4022.  
  4023.  
  4024.  
  4025. FUNCTION configfp
  4026. PARAMETERS find_opt,find_dflt,occurrence
  4027. PRIVATE cnfg_opt,config_str,memline,at_pos,at_pos2,i
  4028.  
  4029. IF TYPE('m.find_dflt')#'C'
  4030.   m.find_dflt=''
  4031. ENDIF
  4032. IF EMPTY(m.find_opt).OR.EMPTY(m.fconfigfp)
  4033.   RETURN UPPER(ALLTRIM(m.find_dflt))
  4034. ENDIF
  4035. m.config_str=CONFIGFP.FP
  4036. m.find_opt=UPPER(m.find_opt)
  4037. m.cnfg_opt=m.find_dflt
  4038. IF TYPE('m.occurrence')#'N'
  4039.   m.occurrence=1
  4040. ENDIF
  4041. FOR m.i = m.occurrence TO 255
  4042.   m.at_pos=ATC(m.find_opt,m.config_str,m.i)
  4043.   IF m.at_pos=0
  4044.     EXIT
  4045.   ENDIF
  4046.   IF m.at_pos>1
  4047.     m.memline=SUBSTR(m.config_str,m.at_pos-1,1)
  4048.     IF .NOT.INLIST(m.memline,m.lf,m.cr,' ',CHR(9))
  4049.       EXIT
  4050.     ENDIF
  4051.   ENDIF
  4052.   m.memline=STRTRAN(STRTRAN(STRTRAN(STRTRAN(STRTRAN(STRTRAN(ALLTRIM(UPPER(;
  4053.             SUBSTR(m.config_str,m.at_pos))),CHR(9),' '),CHR(34),''),;
  4054.             CHR(39),''),'[',''),']',''),' ','')
  4055.   m.at_pos2=AT(m.cr,m.memline)
  4056.   IF m.at_pos2>0
  4057.     m.memline=LEFT(m.memline,m.at_pos2-1)
  4058.   ENDIF
  4059.   m.at_pos=AT('=',m.memline)
  4060.   IF m.at_pos=(LEN(m.find_opt)+1)
  4061.     m.cnfg_opt=SUBSTR(m.memline,m.at_pos+1)
  4062.     EXIT
  4063.   ENDIF
  4064. ENDFOR
  4065. RETURN UPPER(ALLTRIM(m.cnfg_opt))
  4066.  
  4067. * END configfp
  4068.  
  4069.  
  4070.  
  4071. FUNCTION trimdelim
  4072. PARAMETERS str_data,i
  4073.  
  4074. m.str_data=ALLTRIM(m.str_data)
  4075. m.i=LEN(m.str_data)-2
  4076. IF LEFT(m.str_data,1)=='"'.AND.RIGHT(m.str_data,1)=='"'
  4077.   RETURN SUBSTR(m.str_data,2,m.i)
  4078. ENDIF
  4079. IF LEFT(m.str_data,1)=="'".AND.RIGHT(m.str_data,1)=="'"
  4080.   RETURN SUBSTR(m.str_data,2,m.i)
  4081. ENDIF
  4082. IF LEFT(m.str_data,1)=='['.AND.RIGHT(m.str_data,1)==']'
  4083.   RETURN SUBSTR(m.str_data,2,m.i)
  4084. ENDIF
  4085. RETURN m.str_data
  4086.  
  4087. * END trimdelim
  4088.  
  4089.  
  4090.  
  4091. FUNCTION trimext
  4092. PARAMETERS filename,plattype
  4093. PRIVATE at_pos
  4094.  
  4095. m.at_pos=AT('.',m.filename)
  4096. IF m.at_pos>0
  4097.   m.filename=LEFT(m.filename,m.at_pos-1)
  4098. ENDIF
  4099. IF m.plattype
  4100.   m.filename=IIF(_DOS.OR._UNIX,UPPER(m.filename),LOWER(m.filename))
  4101. ENDIF
  4102. RETURN ALLTRIM(m.filename)
  4103.  
  4104. * END trimext
  4105.  
  4106.  
  4107.  
  4108. FUNCTION trimpath
  4109. PARAMETERS filename,trim_ext,plattype
  4110. PRIVATE at_pos
  4111.  
  4112. IF EMPTY(m.filename)
  4113.   RETURN ''
  4114. ENDIF
  4115. m.at_pos=AT(':',m.filename)
  4116. IF m.at_pos>0
  4117.   m.filename=SUBSTR(m.filename,m.at_pos+1)
  4118. ENDIF
  4119. IF m.trim_ext
  4120.   m.filename=trimext(m.filename)
  4121. ENDIF
  4122. IF m.plattype
  4123.   m.filename=IIF(_DOS.OR._UNIX,UPPER(m.filename),LOWER(m.filename))
  4124. ENDIF
  4125. RETURN ALLTRIM(SUBSTR(m.filename,AT('\',m.filename,;
  4126.        MAX(OCCURS('\',m.filename),1))+1))
  4127.  
  4128. * END trimpath
  4129.  
  4130.  
  4131.  
  4132. FUNCTION trimfile
  4133. PARAMETERS filename,plattype
  4134. PRIVATE at_pos
  4135.  
  4136. m.at_pos=RAT('\',m.filename)
  4137. m.filename=ALLTRIM(IIF(m.at_pos=0,m.filename,LEFT(m.filename,m.at_pos)))
  4138. IF m.plattype
  4139.   m.filename=IIF(_DOS.OR._UNIX,UPPER(m.filename),LOWER(m.filename))
  4140. ENDIF
  4141. RETURN m.filename
  4142.  
  4143. * END trimfile
  4144.  
  4145.  
  4146.  
  4147. FUNCTION uniqueflnm
  4148. PRIVATE filename
  4149.  
  4150. DO WHILE .T.
  4151.   m.filename='_'+ALLTRIM(SUBSTR(SYS(3),2,7))
  4152.   IF .NOT.FILE(m.filename+'.DBF')
  4153.     EXIT
  4154.   ENDIF
  4155. ENDDO
  4156. RETURN m.filename
  4157.  
  4158. * END uniqueflnm
  4159.  
  4160.  
  4161.  
  4162. FUNCTION add_fext
  4163. PARAMETERS filename
  4164. PRIVATE i
  4165.  
  4166. IF EMPTY(m.filename).OR.'.'$m.filename
  4167.   m.filename=IIF(_WINDOWS.OR._MAC,LOWER(m.filename),UPPER(m.filename))
  4168.   RETURN m.filename
  4169. ENDIF
  4170. FOR m.i = 1 TO ALEN(a_file_ext)
  4171.   IF FILE(m.filename+a_file_ext(m.i))
  4172.     m.filename=m.filename+a_file_ext(m.i)
  4173.     m.filename=IIF(_WINDOWS.OR._MAC,LOWER(m.filename),UPPER(m.filename))
  4174.     RETURN m.filename
  4175.   ENDIF
  4176. ENDFOR
  4177. m.filename=m.filename+'.PRG'
  4178. m.filename=IIF(_WINDOWS.OR._MAC,LOWER(m.filename),UPPER(m.filename))
  4179. RETURN m.filename
  4180.  
  4181. * END add_fext
  4182.  
  4183.  
  4184.  
  4185. PROCEDURE delaybar
  4186. PARAMETERS msg1,msg2,percent,flag
  4187. PRIVATE center_row,col,delay_cols,delay_bar
  4188.  
  4189. DO CASE
  4190.   CASE .NOT.m.flag
  4191.     IF _WINDOWS.OR._MAC
  4192.       DO updthrm WITH (m.msg1),(m.msg2),(m.percent)
  4193.       RETURN
  4194.     ENDIF
  4195.     IF .NOT.WEXIST('_wdelaybar')
  4196.       RETURN
  4197.     ENDIF
  4198.     ACTIVATE WINDOW _wdelaybar
  4199.     IF .NOT.EMPTY(m.msg1)
  4200.       @ 0,3 SAY PADR(m.msg1,50)
  4201.     ENDIF
  4202.     IF .NOT.EMPTY(m.msg2)
  4203.       @ 1,3 SAY PADR(m.msg2,50)
  4204.     ENDIF
  4205.     m.delay_cols=INT(MIN(m.percent,100)/2)
  4206.     IF m.percent>0
  4207.       m.delay_bar=REPLICATE('█',m.delay_cols)
  4208.       IF MOD(ROUND(MIN(m.percent,100)-.5,0),2)=1
  4209.         m.delay_bar=m.delay_bar+'▌'
  4210.       ENDIF
  4211.       @ 3,3 SAY m.delay_bar
  4212.       IF LEN(m.delay_bar)<50
  4213.         ?? SPACE(50-LEN(m.delay_bar))
  4214.       ENDIF
  4215.     ENDIF
  4216.     RETURN
  4217.   CASE .NOT.EMPTY(m.msg1)
  4218.     IF _WINDOWS.OR._MAC
  4219.       DO actthrm WITH (m.msg1),(m.msg2)
  4220.       RETURN
  4221.     ENDIF
  4222.     m.center_row=INT(SROWS()/2)
  4223.     m.col=INT((SCOLS()-58)/2)
  4224.     DEFINE WINDOW _wdelaybar FROM m.center_row-3,m.col;
  4225.                              TO m.center_row+3,m.col+57;
  4226.                   DOUBLE COLOR SCHEME 5
  4227.     ACTIVATE WINDOW _wdelaybar
  4228.     @ 0,3 SAY PADR(m.msg1,50)
  4229.     @ 1,3 SAY PADR(m.msg2,50)
  4230.     @ 2,1 TO 4,54
  4231.     @ 3,3 SAY SPACE(50) COLOR SCHEME 5
  4232.     RETURN
  4233.   OTHERWISE
  4234.     IF _WINDOWS.OR._MAC
  4235.       DO deactthrmo
  4236.       RETURN
  4237.     ENDIF
  4238.     RELEASE WINDOW _wdelaybar
  4239.     RETURN
  4240. ENDCASE
  4241. RETURN
  4242.  
  4243. * END delaybar
  4244.  
  4245.  
  4246.  
  4247. PROCEDURE actthrm
  4248. PARAMETER text,prompt
  4249. PRIVATE rgb_color,maxcols,clauses_
  4250.  
  4251. m.rgb_color='RGB(0, 0, 0, 192, 192, 192)'
  4252. clauses_="SIZE 5.615,63.833 FONT '"+m.c_dlgface+"',"+STR(m.c_dlgsize,10,5)+;
  4253.          " STYLE '"+m.c_dlgstyle+"'"
  4254. DEFINE WINDOW thrmomete;
  4255.       AT INT((SROW() - (( 5.615 *;
  4256.       FONTMETRIC(1, m.c_dlgface, m.c_dlgsize, m.c_dlgstyle )) /;
  4257.       FONTMETRIC(1, WFONT(1,""), WFONT( 2,""), WFONT(3,"")))) / 2),;
  4258.       INT((SCOL() - (( 63.833 *;
  4259.       FONTMETRIC(6, m.c_dlgface, m.c_dlgsize, m.c_dlgstyle )) /;
  4260.       FONTMETRIC(6, WFONT(1,""), WFONT( 2,""), WFONT(3,"")))) / 2);
  4261.       &clauses_;
  4262.       NOFLOAT;
  4263.       NOCLOSE;
  4264.       NONE;
  4265.       COLOR (m.rgb_color)
  4266. m.maxcols=WCOLS()-4
  4267. clauses_='CENTER'
  4268. MOVE WINDOW thrmomete &clauses_
  4269. ACTIVATE WINDOW thrmomete NOSHOW
  4270. clauses_="FONT '"+m.c_dlgface+"',"+STR(m.c_dlgsize,10,5)+;
  4271.          " STYLE '"+m.c_dlgstyle+"'"
  4272. DO WHILE (TXTWIDTH(m.text)+3)>m.maxcols
  4273.   m.text=LEFT(m.text,LEN(m.text)-2)
  4274. ENDDO
  4275. DO WHILE (TXTWIDTH(m.prompt)+3)>m.maxcols
  4276.   m.prompt=LEFT(m.prompt,LEN(m.prompt)-2)
  4277. ENDDO
  4278. @ 0.5,3 SAY m.text &clauses_
  4279. @ 0.5,TXTWIDTH(m.text)+3 CLEAR TO 1.5,m.maxcols
  4280. @ 1.5,3 SAY m.prompt &clauses_
  4281. @ 1.5,TXTWIDTH(m.prompt)+3 CLEAR TO 2.5,m.maxcols
  4282. m.rgb_color='RGB(255, 255, 255, 255, 255, 255)'
  4283. @ 0.000,0.000 TO 0.000,63.833;
  4284.                  COLOR (m.rgb_color)
  4285. m.rgb_color='RGB(255, 255, 255, 255, 255, 255)'
  4286. @ 0.000,0.000 TO 5.615,0.000;
  4287.                  COLOR (m.rgb_color)
  4288. m.rgb_color='RGB(128, 128, 128, 128, 128, 128)'
  4289. @ 0.385,0.667 TO 5.231,0.667;
  4290.                  COLOR (m.rgb_color)
  4291. m.rgb_color='RGB(128, 128, 128, 128, 128, 128)'
  4292. @ 0.308,0.667 TO 0.308,63.167;
  4293.                  COLOR (m.rgb_color)
  4294. m.rgb_color='RGB(255, 255, 255, 255, 255, 255)'
  4295. @ 0.385,63.000 TO 5.308,63.000;
  4296.                  COLOR (m.rgb_color)
  4297. m.rgb_color='RGB(255, 255, 255, 255, 255, 255)'
  4298. @ 5.231,0.667 TO 5.231,63.167;
  4299.                  COLOR (m.rgb_color)
  4300. m.rgb_color='RGB(128, 128, 128, 128, 128, 128)'
  4301. @ 5.538,0.000 TO 5.538,63.833;
  4302.                  COLOR (m.rgb_color)
  4303. m.rgb_color='RGB(128, 128, 128, 128, 128, 128)'
  4304. @ 0.000,63.667 TO 5.615,63.667;
  4305.                  COLOR (m.rgb_color)
  4306. m.rgb_color='RGB(128, 128, 128, 128, 128, 128)'
  4307. @ 3.000,3.333 TO 4.231,3.333;
  4308.                  COLOR (m.rgb_color)
  4309. m.rgb_color='RGB(255, 255, 255, 255, 255, 255)'
  4310. @ 3.000,60.333 TO 4.308,60.333;
  4311.                  COLOR (m.rgb_color)
  4312. m.rgb_color='RGB(128, 128, 128, 128, 128, 128)'
  4313. @ 3.000,3.333 TO 3.000,60.333;
  4314.                  COLOR (m.rgb_color)
  4315. m.rgb_color='RGB(255, 255, 255, 255, 255, 255)'
  4316. @ 4.231,3.333 TO 4.231,60.500;
  4317.                  COLOR (m.rgb_color)
  4318. SHOW WINDOW thrmomete TOP
  4319. RETURN
  4320.  
  4321. * END actthrm
  4322.  
  4323.  
  4324.  
  4325. PROCEDURE updthrm
  4326. PARAMETER text,prompt,percent
  4327. PRIVATE nblocks,percent,rgb_color,maxcols,clauses_
  4328.  
  4329. ACTIVATE WINDOW thrmomete
  4330. m.maxcols=WCOLS()-4
  4331. clauses_="FONT '"+m.c_dlgface+"',"+STR(m.c_dlgsize,10,5)+;
  4332.          " STYLE '"+m.c_dlgstyle+"'"
  4333. DO WHILE (TXTWIDTH(m.text)+3)>m.maxcols
  4334.   m.text=LEFT(m.text,LEN(m.text)-2)
  4335. ENDDO
  4336. DO WHILE (TXTWIDTH(m.prompt)+3)>m.maxcols
  4337.   m.prompt=LEFT(m.prompt,LEN(m.prompt)-2)
  4338. ENDDO
  4339. IF .NOT.EMPTY(m.text)
  4340.   @ 0.5,3 SAY m.text &clauses_
  4341.   @ 0.5,TXTWIDTH(m.text)+3 CLEAR TO 1.5,m.maxcols
  4342. ENDIF
  4343. IF .NOT.EMPTY(m.prompt)
  4344.   @ 1.5,3 SAY m.prompt &clauses_
  4345.   @ 1.5,TXTWIDTH(m.prompt)+3 CLEAR TO 2.5,m.maxcols
  4346. ENDIF
  4347. m.percent=MIN(m.percent,100)
  4348. m.nblocks=(m.percent/100) * 56.269
  4349. clauses_='PATTERN 1'
  4350. m.rgb_color='RGB(128, 128, 128, 128, 128, 128)'
  4351. @ 3.000,3.333 TO 4.231,m.nblocks + 3.333 &clauses_;
  4352.                  COLOR (m.rgb_color)
  4353. IF m.percent<100
  4354.   @ 3.100,m.nblocks + 3.333 CLEAR TO 4.231,59.602
  4355. ENDIF
  4356. RETURN
  4357.  
  4358. * END updthrm
  4359.  
  4360.  
  4361.  
  4362. PROCEDURE deactthrmo
  4363.  
  4364. IF WEXIST("thrmomete")
  4365.   RELEASE WINDOW thrmomete
  4366. ENDIF
  4367. RETURN
  4368.  
  4369. * END deactthrmo
  4370.  
  4371.  
  4372.  
  4373. FUNCTION dispmsg
  4374. PARAMETERS msg
  4375.  
  4376. WAIT CLEAR
  4377. IF EMPTY(m.msg)
  4378.   RETURN .F.
  4379. ENDIF
  4380. WAIT m.msg WINDOW NOWAIT
  4381. RETURN .T.
  4382.  
  4383. * END dispmsg
  4384.  
  4385.  
  4386.  
  4387. FUNCTION warning
  4388. PARAMETERS cmnd_str,operand
  4389.  
  4390. m.warnings=m.warnings+1
  4391. IF TYPE('m.cmnd_str')#'C'
  4392.   RETURN m.warnings
  4393. ENDIF
  4394. IF TYPE('m.operand')=='C'
  4395.   m.operand=STRTRAN(m.operand,' ','')
  4396.   IF LEFT(m.operand,1)=='.'
  4397.     m.operand=SUBSTR(m.operand,2)
  4398.   ENDIF
  4399.   m.cmnd_str=m.cmnd_str+" '"+m.operand+"' not found"
  4400. ENDIF
  4401. IF TYPE('m.fscxbase')=='C'.AND..NOT.EMPTY(m.fscxbase)
  4402.   m.cmnd_str=m.cmnd_str+'  ['+trimpath(m.fscxbase)+']'
  4403. ENDIF
  4404. WAIT CLEAR
  4405. IF TYPE('m.autohalt')=='C'.AND.m.autohalt=='OFF'
  4406.   WAIT LEFT(m.cmnd_str,254) WINDOW NOWAIT
  4407.   RETURN m.warnings
  4408. ENDIF
  4409. IF .NOT.EMPTY(_FOX25REV)
  4410.   m.cmnd_str='GENSCRNX Warning Mode - {C}ancel  {S}uspend  {I}gnore'+CHR(13)+;
  4411.              CHR(13)+m.cmnd_str
  4412. ENDIF
  4413. CLEAR TYPEAHEAD
  4414. WAIT LEFT(m.cmnd_str,254) WINDOW
  4415. DO CASE
  4416.   CASE MDOWN()
  4417.     =.F.
  4418.   CASE UPPER(CHR(LASTKEY()))=='I'
  4419.     RETURN m.warnings
  4420.   CASE UPPER(CHR(LASTKEY()))=='S'
  4421.     m.lasterror=ON('ERROR')
  4422.     ON ERROR
  4423.     WAIT CLEAR
  4424.     CLEAR TYPEAHEAD
  4425.     m.lastcursr=SET('CURSOR')
  4426.     ACTIVATE WINDOW Command
  4427.     SET ESCAPE ON
  4428.     SUSPEND
  4429.     SET ESCAPE OFF
  4430.     SET CURSOR &lastcursr
  4431.     ON ERROR &lasterror
  4432.     RETURN m.warnings
  4433. ENDCASE
  4434. m.autorun='OFF'
  4435. DO cleanup
  4436. CANCEL
  4437.  
  4438. * END warning
  4439.  
  4440.  
  4441.  
  4442. PROCEDURE errorhnd
  4443. PARAMETER error_no,msg,prg_name,line_no,codeline
  4444. PRIVATE colright,row,col,lasterror,lastcursr,prompt,maxcols
  4445.  
  4446. m.lasterror=ON('ERROR')
  4447. ON ERROR
  4448. SET ESCAPE OFF
  4449. WAIT CLEAR
  4450. CLEAR GETS
  4451. CLEAR TYPEAHEAD
  4452. m.lastcursr=SET('CURSOR')
  4453. SET CURSOR OFF
  4454. m.row=IIF(_DOS.OR._UNIX,INT((SROWS()-20)/2),0)
  4455. m.col=IIF(_DOS.OR._UNIX,INT((SCOLS()-69)/2),0)
  4456. DEFINE WINDOW win_prompt FROM m.row,m.col;
  4457.                          TO m.row+20,m.col+69;
  4458.               TITLE ' GENSCRNX Error Mode ';
  4459.               DOUBLE FLOAT SHADOW COLOR SCHEME 7
  4460. ACTIVATE WINDOW win_prompt
  4461. m.maxcols=WCOLS()-2
  4462. m.colright=WCOLS()-19
  4463. m.codeline=ALLTRIM(m.codeline)
  4464. m.colorschm=IIF(_WINDOWS.OR._MAC,2,1)
  4465. @ 1,1 EDIT m.codeline;
  4466.       SIZE 8,m.maxcols;
  4467.       NOMODIFY SCROLL;
  4468.       COLOR SCHEME (m.colorschm)
  4469. @ 9,1 TO 9,m.maxcols
  4470. @ 10,1 SAY 'Error message :  '
  4471. ?? PADR(ALLTRIM(m.msg),m.colright)
  4472. @ 11,1 SAY 'Error number  :  '
  4473. ?? LTRIM(STR(m.error_no))
  4474. @ 12,1 SAY 'Procedure name:  '
  4475. ?? PADR(ALLTRIM(m.prg_name),m.colright)
  4476. @ 13,1 SAY 'Line number   :  '
  4477. ?? IIF(m.line_no>0,LTRIM(STR(m.line_no)),'Unknown')
  4478. IF .NOT.EMPTY(ALIAS())
  4479.   @ 14,1 SAY 'Data source   :  '
  4480.   ?? PADR(m.fscxbase+'  [SCXBASE]',m.colright)
  4481.   @ 15,1 SAY 'Data current  :  '
  4482.   ?? PADR(ALLTRIM(DBF())+'  ['+ALIAS()+']',m.colright)
  4483.   @ 16,1 SAY 'Record number :  '
  4484.   ?? LTRIM(STR(RECNO()))
  4485. ENDIF
  4486. @ 17,1 TO 17,m.maxcols
  4487. @ 18,9 GET m.prompt ;
  4488.        PICTURE "@*HT \!\<Cancel;\<Suspend;\<Ignore" ;
  4489.        SIZE 1,11,8 ;
  4490.        DEFAULT 1
  4491. SET CURSOR ON
  4492. READ CYCLE MODAL OBJECT 2
  4493. DO CASE
  4494.   CASE m.prompt=2
  4495.     @ 18,0 CLEAR
  4496.     ACTIVATE SCREEN
  4497.     ACTIVATE WINDOW Command
  4498.     SET ESCAPE ON
  4499.     SUSPEND
  4500.     SET ESCAPE OFF
  4501.     RELEASE WINDOW win_prompt
  4502.     SET CURSOR &lastcursr
  4503.     ON ERROR &lasterror
  4504.     RETURN
  4505.   CASE m.prompt=3
  4506.     RELEASE WINDOW win_prompt
  4507.     SET CURSOR &lastcursr
  4508.     ON ERROR &lasterror
  4509.     RETURN
  4510. ENDCASE
  4511. RELEASE WINDOW win_prompt
  4512. m.gen_mode=.F.
  4513. DO cleanup
  4514. CANCEL
  4515.  
  4516. * END errorhnd
  4517.  
  4518.  
  4519.  
  4520. PROCEDURE esc_check
  4521. PRIVATE i
  4522.  
  4523. IF CHRSAW()
  4524.   m.i=INKEY('H')
  4525.   IF m.i=27
  4526.     DO cleanup
  4527.     CANCEL
  4528.   ENDIF
  4529. ENDIF
  4530. RETURN
  4531.  
  4532. * END esc_check
  4533.  
  4534.  
  4535.  
  4536. PROCEDURE cleanup
  4537. PARAMETERS sprcheck
  4538. PRIVATE range1,range2,wchilds,winontop1,winontop2,lastslct
  4539.  
  4540. m.lastslct=SELECT()
  4541. RELEASE WINDOWS _wdelaybar,thrmomete
  4542. IF USED('_TEMPFILE')
  4543.   USE IN _TEMPFILE
  4544. ENDIF
  4545. IF USED('CONFIGFP')
  4546.   USE IN CONFIGFP
  4547. ENDIF
  4548. IF USED('FOXSCX')
  4549.   USE IN FOXSCX
  4550. ENDIF
  4551. IF USED('SCXINSERT')
  4552.   USE IN SCXINSERT
  4553. ENDIF
  4554. IF USED('SCXBASE')
  4555.   SELECT SCXBASE
  4556.   SCATTER MEMVAR MEMO BLANK
  4557.   USE IN SCXBASE
  4558. ENDIF
  4559. IF USED('SCXDATA')
  4560.   USE IN SCXDATA
  4561. ENDIF
  4562. IF USED('SCXDATA2')
  4563.   USE IN SCXDATA2
  4564. ENDIF
  4565. IF USED('PJXBASE')
  4566.   USE IN PJXBASE
  4567. ENDIF
  4568. IF USED('PJXDATA')
  4569.   USE IN PJXDATA
  4570. ENDIF
  4571. IF USED('INSERTFILE')
  4572.   USE IN INSERTFILE
  4573. ENDIF
  4574. IF TYPE('m.fscxdata')#'C'
  4575.   IF USED('SPRDATA')
  4576.     USE IN SPRDATA
  4577.   ENDIF
  4578.   ON ERROR
  4579.   ACTIVATE SCREEN
  4580.   IF _WINDOWS.OR._MAC
  4581.     SET MESSAGE TO
  4582.   ENDIF
  4583.   SET COMPATIBLE OFF
  4584.   SET EXACT OFF
  4585.   SET SAFETY OFF
  4586.   SET EXCLUSIVE ON
  4587.   SET UDFPARMS TO VALUE
  4588.   SET CURSOR ON
  4589.   SET MEMOWIDTH TO 50
  4590.   SET ESCAPE ON
  4591.   WAIT CLEAR
  4592.   CLEAR TYPEAHEAD
  4593.   CANCEL
  4594. ENDIF
  4595. =erasedbf(m.projdbf,'PJXDATA')
  4596. IF TYPE('m.scxcount')=='N'.AND.m.scxcount>0
  4597.   FOR m.i = 1 TO m.scxcount
  4598.     IF TYPE('a_fscxdata(m.i)')=='C'
  4599.       m.fscxdata=a_fscxdata(m.i)
  4600.     ENDIF
  4601.     =erasedbf(m.fscxdata,'SCXDATA')
  4602.   ENDFOR
  4603. ENDIF
  4604. m.range1=0
  4605. m.range2=0
  4606. IF gen_mode.AND.m.sprcheck.AND..NOT.m.fromproj.AND.;
  4607.    m.compspr=='ON'.AND.FILE(m.fsprout)
  4608.   IF _WINDOWS.OR._MAC
  4609.     SET MESSAGE TO LEFT('Compiling Screen Code: '+LOWER(m.fsprout),79)
  4610.   ENDIF
  4611.   IF errcheck()
  4612.     m.i=SROWS()-25-IIF(_WINDOWS.OR._MAC.AND.SET('STATUS BAR')=='ON',1,0)
  4613.     DEFINE WINDOW _weditfile FROM 17+m.i,0 TO 24+m.i,SCOLS()-1;
  4614.                   SYSTEM CLOSE FLOAT GROW MINIMIZE SHADOW ZOOM;
  4615.                   COLOR SCHEME 8
  4616.     MODIFY FILE (m.fsprerr) NOWAIT;
  4617.                 RANGE 1,1 WINDOW _weditfile
  4618.     ZOOM WINDOW _weditfile NORM FROM 1+m.i,0 TO 15+m.i,SCOLS()-1
  4619.     MODIFY FILE (m.fsprout) NOWAIT;
  4620.                 RANGE m.range1,m.range2 WINDOW _weditfile
  4621.     RELEASE WINDOW _weditfile
  4622.   ENDIF
  4623.   IF _WINDOWS.OR._MAC
  4624.     SET MESSAGE TO
  4625.   ENDIF
  4626. ENDIF
  4627. IF USED('SPRDATA')
  4628.   USE IN SPRDATA
  4629. ENDIF
  4630. SELECT (m.lastslct)
  4631. WAIT CLEAR
  4632. IF m.warnings>0
  4633.   WAIT ALLTRIM(STR(m.warnings,8))+' warning'+IIF(m.warnings>1,'s','');
  4634.        WINDOW NOWAIT
  4635. ENDIF
  4636. DO restoreset
  4637. CLEAR TYPEAHEAD
  4638. IF .NOT.gen_mode.OR.m.fromproj
  4639.   RETURN
  4640. ENDIF
  4641. m.wchilds=WCHILD()-IIF(m.range1=0,0,2)
  4642. IF m.wchilds<=1
  4643.   IF m.range1=0.AND.m.autorun=='ON'.AND.FILE(m.fsprout)
  4644.     KEYBOARD '{Ctrl+W}{Ctrl+F2}DO '+UPPER(m.fsprout)+CHR(13)
  4645.   ENDIF
  4646.   RETURN
  4647. ENDIF
  4648. m.winontop1=''
  4649. FOR m.i = 1 TO m.wchilds
  4650.   m.winontop2=m.winontop1
  4651.   m.winontop1=WCHILD(m.i-1)
  4652. ENDFOR
  4653. IF ATC('.PRO',m.winontop2)=0.OR.;
  4654.    .NOT.UPPER(trimext(m.winontop1))==UPPER(trimext(m.winontop2))
  4655.   IF m.range1=0.AND.m.autorun=='ON'.AND.FILE(m.fsprout)
  4656.     KEYBOARD '{Ctrl+W}{Ctrl+F2}DO '+UPPER(m.fsprout)+CHR(13)
  4657.   ENDIF
  4658.   RETURN
  4659. ENDIF
  4660. IF m.range1=0
  4661.   KEYBOARD '{Ctrl+W}' PLAIN
  4662.   IF m.autorun=='ON'.AND.FILE(m.fsprout)
  4663.     KEYBOARD '{Ctrl+W}{Ctrl+F2}DO '+UPPER(m.fsprout)+CHR(13)
  4664.   ENDIF
  4665. ELSE
  4666.   KEYBOARD '{Ctrl+F1}{Ctrl+F1}{Ctrl+W}' PLAIN
  4667.   FOR m.i = 1 TO m.wchilds-1
  4668.     KEYBOARD '{Ctrl+F1}' PLAIN
  4669.   ENDFOR
  4670. ENDIF
  4671. RETURN
  4672.  
  4673. * END cleanup
  4674.  
  4675.  
  4676.  
  4677. FUNCTION errcheck
  4678. PRIVATE memline,find_str,at_pos,i,j,len_adj,lastmemowd
  4679.  
  4680. COMPILE (m.fsprout)
  4681. IF .NOT.m.dispspr=='ON'.OR..NOT.FILE(m.fsprerr)
  4682.   RETURN .F.
  4683. ENDIF
  4684. m.lastmemowd=SET('MEMOWIDTH')
  4685. SET MEMOWIDTH TO 254
  4686. m.find_str=''
  4687. m.range1=1
  4688. m.range2=1
  4689. IF .NOT.USED('SPRDATA')
  4690.   CREATE CURSOR SPRDATA (SPR M, INS M)
  4691.   INSERT BLANK
  4692.   APPEND MEMO SPR FROM (m.fsprout) OVERWRITE
  4693. ENDIF
  4694. SELECT SPRDATA
  4695. m.len_adj=LEN(SPR)
  4696. REPLACE SPR WITH STRTRAN(SPR,m.lf+';',';')+m.cr_lf
  4697. m.len_adj=m.len_adj-LEN(SPR)+2
  4698. APPEND MEMO INS FROM (m.fsprerr) OVERWRITE
  4699. m.at_pos=ATC('Error in line ',INS)
  4700. IF m.at_pos>0
  4701.   m.i=VAL(SUBSTR(INS,m.at_pos+14))
  4702.   m.find_str=MLINE(SPR,m.i)
  4703.   IF .NOT.m.find_str$MLINE(INS,1)
  4704.     m.find_str=MLINE(INS,1)
  4705.   ENDIF
  4706.   FOR m.j = (m.i-1) TO 1 STEP -1
  4707.     m.memline=MLINE(SPR,m.j)
  4708.     IF .NOT.RIGHT(m.memline,1)==';'
  4709.       EXIT
  4710.     ENDIF
  4711.     m.find_str=m.memline+m.cr_lf+m.find_str
  4712.   ENDFOR
  4713.   FOR m.j = m.i TO (MEMLINES(SPR)-1)
  4714.     m.memline=MLINE(SPR,m.j)
  4715.     IF .NOT.RIGHT(m.memline,1)==';'
  4716.       EXIT
  4717.     ENDIF
  4718.     m.find_str=m.find_str+m.cr_lf+m.memline
  4719.   ENDFOR
  4720.   IF .NOT.EMPTY(m.find_str)
  4721.     IF m.i=1
  4722.       m.at_pos=0
  4723.     ELSE
  4724.       m.at_pos=AT(m.lf+m.find_str+m.cr,SPR)
  4725.       IF m.at_pos=-1
  4726.         m.at_pos=AT(m.cr+m.find_str+m.cr,SPR)
  4727.       ENDIF
  4728.     ENDIF
  4729.     IF m.at_pos>0.OR.m.i=1
  4730.       m.range1=m.at_pos+1
  4731.       m.range2=m.at_pos+LEN(m.find_str)+m.len_adj+1
  4732.     ENDIF
  4733.   ENDIF
  4734. ENDIF
  4735. SET MEMOWIDTH TO (m.lastmemowd)
  4736. RETURN .T.
  4737.  
  4738. * END errcheck
  4739.  
  4740.  
  4741.  
  4742. PROCEDURE restoreset
  4743.  
  4744. m.drv_no=0
  4745. IF TYPE('m.lastselect')=='N'
  4746.   SELECT (m.lastselect)
  4747. ENDIF
  4748. SET MEMOWIDTH TO (m.lastmemow)
  4749. _MLINE=0
  4750. ACTIVATE SCREEN
  4751. @ 0,0 SAY ''
  4752. IF EMPTY(m.lastpoint)
  4753.   SET POINT TO
  4754. ELSE
  4755.   SET POINT TO (m.lastpoint)
  4756. ENDIF
  4757. IF m.lastsetudfp=='VALUE'
  4758.   SET UDFPARMS TO VALUE
  4759. ELSE
  4760.   SET UDFPARMS TO REFERENCE
  4761. ENDIF
  4762. IF m.lastsetexac=='ON'
  4763.   SET EXACT ON
  4764. ELSE
  4765.   SET EXACT OFF
  4766. ENDIF
  4767. IF m.lastsetexcl=='ON'
  4768.   SET EXCLUSIVE ON
  4769. ELSE
  4770.   SET EXCLUSIVE OFF
  4771. ENDIF
  4772. IF EMPTY(m.lastsetpath)
  4773.   SET PATH TO
  4774. ELSE
  4775.   SET PATH TO (m.lastsetpath)
  4776. ENDIF
  4777. SET DECIMALS TO (m.lastsetdec)
  4778. IF m.lastsetnear=='ON'
  4779.   SET NEAR ON
  4780. ELSE
  4781.   SET NEAR OFF
  4782. ENDIF
  4783. IF m.lastsetcry=='ON'
  4784.   SET CARRY ON
  4785. ELSE
  4786.   SET CARRY OFF
  4787. ENDIF
  4788. IF m.lastsetdel=='ON'
  4789.   SET DELETED ON
  4790. ELSE
  4791.   SET DELETED OFF
  4792. ENDIF
  4793. IF m.lastsetsfty=='ON'
  4794.   SET SAFETY ON
  4795. ELSE
  4796.   SET SAFETY OFF
  4797. ENDIF
  4798. IF m.lastsetcomp=='ON'
  4799.   SET COMPATIBLE ON
  4800. ELSE
  4801.   SET COMPATIBLE OFF
  4802. ENDIF
  4803. ON ERROR
  4804. IF _WINDOWS.OR._MAC
  4805.   SET MESSAGE TO
  4806. ENDIF
  4807. SET CURSOR ON
  4808. SET ESCAPE ON
  4809. RETURN
  4810.  
  4811. * END restoreset
  4812.  
  4813.  
  4814.  
  4815. PROCEDURE restoreenv
  4816.  
  4817. SET COMPATIBLE OFF
  4818. SET EXACT OFF
  4819. SET PATH TO (m.newsetpath)
  4820. SET SAFETY OFF
  4821. SET EXCLUSIVE ON
  4822. SET UDFPARMS TO VALUE
  4823. SET CURSOR OFF
  4824. SET MEMOWIDTH TO 254
  4825. SET POINT TO '.'
  4826. RETURN
  4827.  
  4828. * END restoreenv
  4829.  
  4830.  
  4831.  
  4832. FUNCTION evltxt
  4833. PARAMETERS old_text
  4834. PRIVATE new_text,eval_str,eval_str1,eval_str2,var_type
  4835. PRIVATE at_pos,at_pos2,at_pos3,at_pos4,at_pos5,old_str,new_str
  4836. PRIVATE i,j,at_line,onerror,cr_lf,evlmode,mthd_str,sellast
  4837.  
  4838. IF TYPE('m.ignrbraces')=='L'.AND.m.ignrbraces
  4839.   RETURN m.old_text
  4840. ENDIF
  4841. m.cr_lf=CHR(13)+CHR(10)
  4842. m.onerror=ON('ERROR')
  4843. m.new_text=m.old_text
  4844. m.at_pos3=1
  4845. DO WHILE .T.
  4846.   m.at_pos=AT('{{',SUBSTR(m.old_text,m.at_pos3))
  4847.   IF m.at_pos=0
  4848.     EXIT
  4849.   ENDIF
  4850.   m.at_pos2=AT('}}',SUBSTR(m.old_text,m.at_pos+m.at_pos3-1))
  4851.   IF m.at_pos2=0
  4852.     EXIT
  4853.   ENDIF
  4854.   m.at_pos4=AT('{{',SUBSTR(m.old_text,m.at_pos+m.at_pos3+1))
  4855.   IF m.at_pos4>0.AND.m.at_pos4<m.at_pos2
  4856.     m.at_pos4=OCCURS('{{',SUBSTR(m.old_text,m.at_pos+m.at_pos3-1,;
  4857.               m.at_pos2-m.at_pos4))
  4858.     m.at_pos4=AT('{{',SUBSTR(m.old_text,m.at_pos+m.at_pos3-1),m.at_pos4)
  4859.     m.old_str=SUBSTR(m.old_text,m.at_pos+m.at_pos3-1,m.at_pos2+1)
  4860.     m.eval_str=SUBSTR(m.old_str,3,LEN(m.old_str)-2)
  4861.     m.old_str=evltxt(m.eval_str)
  4862.     m.old_text=STRTRAN(m.old_text,m.eval_str,m.old_str)
  4863.     m.new_text=STRTRAN(m.new_text,m.eval_str,m.old_str)
  4864.     LOOP
  4865.   ENDIF
  4866.   m.old_str=SUBSTR(m.old_text,m.at_pos+m.at_pos3-1,m.at_pos2+1)
  4867.   m.eval_str=ALLTRIM(SUBSTR(m.old_str,3,LEN(m.old_str)-4))
  4868.   DO esc_check
  4869.   m.evlmode=.F.
  4870.   ON ERROR DO errorhnd WITH ERROR(),MESSAGE(),PROGRAM(),LINENO(),;
  4871.                             m.old_str+m.cr_lf+'──────────────────────────'+;
  4872.                             '────────────────────────────────────'+;
  4873.                             m.cr_lf+MESSAGE(1)
  4874.   DO CASE
  4875.     CASE EMPTY(m.eval_str).OR.(TYPE('m.braces')=='C'.AND.m.braces=='OFF')
  4876.       m.eval_str=''
  4877.     CASE LEFT(m.eval_str,2)=='&.'
  4878.       m.eval_str=SUBSTR(m.eval_str,3)
  4879.       &eval_str &&;
  4880.       ──────────────────────────────────────────────────────────────;
  4881.       Error occured during macro substitution of {{&. <expC> }}.
  4882.       m.eval_str=''
  4883.     CASE LEFT(m.eval_str,1)=='<'
  4884.       m.eval_str=insert(SUBSTR(m.eval_str,2)) &&;
  4885.       ──────────────────────────────────────────────────────────────;
  4886.       Error occured during evaluation of {{< <file> }}.
  4887.     CASE LEFT(m.eval_str,1)=='@'
  4888.       m.eval_str=wordsearch(SUBSTR(MLINE(m.eval_str,1),2))
  4889.       IF m.eval_str==m.null
  4890.         m.eval_str=''
  4891.       ENDIF
  4892.     CASE '::'$m.eval_str
  4893.       m.eval_str1=''
  4894.       m.eval_str2=''
  4895.       m.at_pos4=AT('||',m.eval_str)
  4896.       IF m.at_pos4>0
  4897.         m.eval_str2=IIF(m.at_pos4>0,SUBSTR(m.eval_str,m.at_pos4+2),'')
  4898.         m.eval_str=LEFT(m.eval_str,m.at_pos4-1)
  4899.       ENDIF
  4900.       FOR m.i = 1 TO 2
  4901.         m.at_pos4=AT('::',m.eval_str)
  4902.         m.evlmode=.T.
  4903.         m.eval_str=objdata(LEFT(m.eval_str,m.at_pos4-1),;
  4904.                    SUBSTR(m.eval_str,m.at_pos4+2)) &&;
  4905.         ──────────────────────────────────────────────────────────────;
  4906.         Error occured during evaluation of {{ <expC1> :: <expC2> }}.
  4907.         IF m.i=1.AND..NOT.EMPTY(m.eval_str2)
  4908.           m.eval_str1=m.eval_str
  4909.           m.eval_str=m.eval_str2
  4910.           LOOP
  4911.         ENDIF
  4912.         m.evlmode=.F.
  4913.         IF m.i=2
  4914.           m.eval_str2=m.eval_str
  4915.           IF EMPTY(m.eval_str2)
  4916.             m.eval_str=m.eval_str1
  4917.             EXIT
  4918.           ENDIF
  4919.           IF EMPTY(m.eval_str1)
  4920.             m.eval_str=m.eval_str2
  4921.             EXIT
  4922.           ENDIF
  4923.           m.sellast=SELECT()
  4924.           IF .NOT.USED('_TEMPFILE')
  4925.             CREATE CURSOR _TEMPFILE (COMMENT M, SETUPCODE M)
  4926.             INSERT BLANK
  4927.           ENDIF
  4928.           SELECT _TEMPFILE
  4929.           LOCATE
  4930.           REPLACE COMMENT WITH m.eval_str2, SETUPCODE WITH m.eval_str1
  4931.           m.eval_str1=''
  4932.           m.eval_str2=''
  4933.           DO WHILE .T.
  4934.             =esc_check()
  4935.             m.mthd_str=wordsearch(m.c_method)
  4936.             IF m.mthd_str==m.null
  4937.               m.eval_str=COMMENT+m.cr_lf+SETUPCODE
  4938.               EXIT
  4939.             ENDIF
  4940.             IF EMPTY(m.mthd_str)
  4941.               REPLACE COMMENT WITH strtranc(m.c_method,m.m_method,1,1)
  4942.               LOOP
  4943.             ENDIF
  4944.             m.at_pos4=ATC(m.c_method+' '+m.mthd_str+m.cr,COMMENT+m.cr)
  4945.             IF m.at_pos4=0
  4946.               REPLACE COMMENT WITH strtranc(m.c_method,m.m_method,1,1)
  4947.               LOOP
  4948.             ENDIF
  4949.             m.at_pos5=ATC(m.c_endmthd,SUBSTR(COMMENT,m.at_pos4))
  4950.             IF m.at_pos5>0
  4951.               m.at_pos5=m.at_pos5+LEN(m.c_endmthd)
  4952.             ELSE
  4953.               m.at_pos5=LEN(COMMENT)+1
  4954.             ENDIF
  4955.             m.eval_str1=SUBSTR(COMMENT,m.at_pos4,m.at_pos5)+m.cr_lf
  4956.             REPLACE COMMENT WITH LEFT(COMMENT,m.at_pos4-1)+;
  4957.                                  SUBSTR(COMMENT,m.at_pos4+m.at_pos5)
  4958.             m.at_pos4=ATC(m.c_method+' '+m.mthd_str+m.cr,SETUPCODE+m.cr)
  4959.             IF m.at_pos4=0
  4960.               LOOP
  4961.             ENDIF
  4962.             m.at_pos5=ATC(m.c_endmthd,SUBSTR(SETUPCODE,m.at_pos4))
  4963.             IF m.at_pos5>0
  4964.               m.at_pos5=m.at_pos5+LEN(m.c_endmthd)
  4965.             ELSE
  4966.               m.at_pos5=LEN(SETUPCODE)+1
  4967.             ENDIF
  4968.             REPLACE SETUPCODE WITH LEFT(SETUPCODE,m.at_pos4-1)+m.eval_str1+;
  4969.                                    SUBSTR(SETUPCODE,m.at_pos4+m.at_pos5)
  4970.           ENDDO
  4971.           m.eval_str=SETUPCODE
  4972.           SELECT (m.sellast)
  4973.         ENDIF
  4974.         EXIT
  4975.       ENDFOR
  4976.       m.eval_str1=''
  4977.       m.eval_str2=''
  4978.     OTHERWISE
  4979.       m.eval_str=EVALUATE(m.eval_str) &&;
  4980.       ──────────────────────────────────────────────────────────────;
  4981.       Error occured during evaluation of {{ <expC> }}.
  4982.   ENDCASE
  4983.   IF EMPTY(m.onerror)
  4984.     ON ERROR
  4985.   ELSE
  4986.     ON ERROR &onerror
  4987.   ENDIF
  4988.   m.var_type=TYPE('m.eval_str')
  4989.   DO CASE
  4990.     CASE m.var_type=='C'
  4991.       m.new_str=m.eval_str
  4992.     CASE m.var_type=='N'
  4993.       m.new_str=ALLTRIM(STR(m.eval_str,24,12))
  4994.       DO WHILE RIGHT(m.new_str,1)=='0'
  4995.         m.new_str=LEFT(m.new_str,LEN(m.new_str)-1)
  4996.         IF RIGHT(m.new_str,1)=='.'
  4997.           m.new_str=LEFT(m.new_str,LEN(m.new_str)-1)
  4998.           EXIT
  4999.         ENDIF
  5000.       ENDDO
  5001.     CASE m.var_type=='D'
  5002.       m.new_str=DTOC(m.eval_str)
  5003.     CASE m.var_type=='L'
  5004.       m.new_str=IIF(m.eval_str,'.T.','.F.')
  5005.     OTHERWISE
  5006.       m.new_str=m.old_str
  5007.   ENDCASE
  5008.   m.new_text=STRTRAN(m.new_text,m.old_str,m.new_str)
  5009.   m.at_pos2=m.at_pos+LEN(m.new_str)
  5010.   IF m.at_pos2<=0
  5011.     EXIT
  5012.   ENDIF
  5013.   m.at_pos3=m.at_pos3+m.at_pos2
  5014. ENDDO
  5015. m.j=0
  5016. DO WHILE '{{'$m.new_text.AND.'}}'$m.new_text
  5017.   =esc_check()
  5018.   m.i=LEN(m.new_text)
  5019.   m.new_text=evltxt(m.new_text)
  5020.   IF m.i=LEN(m.new_text)
  5021.     IF m.j>=2
  5022.       EXIT
  5023.     ENDIF
  5024.     m.j=m.j+1
  5025.   ENDIF
  5026. ENDDO
  5027. RETURN m.new_text
  5028.  
  5029. * END evltxt
  5030.  
  5031.  
  5032.  
  5033. FUNCTION evlstr
  5034. PARAMETERS eval_str
  5035.  
  5036. IF EMPTY(m.eval_str)
  5037.   RETURN m.eval_str
  5038. ENDIF
  5039. IF .NOT.LEFT(m.eval_str,1)=='@'
  5040.   RETURN EVALUATE(m.eval_str)
  5041. ENDIF
  5042. m.eval_str=wordsearch(SUBSTR(m.eval_str,2))
  5043. IF m.eval_str==m.null
  5044.   m.eval_str=''
  5045. ENDIF
  5046. RETURN m.eval_str
  5047.  
  5048. * END evlstr
  5049.  
  5050.  
  5051.  
  5052. FUNCTION evlmsg
  5053. PARAMETERS old_str
  5054. PRIVATE new_text,eval_str,var_type
  5055.  
  5056. IF TYPE('m.old_str')#'C'
  5057.   RETURN ''
  5058. ENDIF
  5059. IF .NOT.LEFT(m.old_str,1)=='@'
  5060.   RETURN m.old_str
  5061. ENDIF
  5062. m.eval_str=EVALUATE(SUBSTR(MLINE(m.old_str,1),2))
  5063. m.var_type=TYPE('m.eval_str')
  5064. DO CASE
  5065.   CASE m.var_type=='C'
  5066.     m.new_str=m.eval_str
  5067.   CASE m.var_type=='N'
  5068.     m.new_str=ALLTRIM(STR(m.eval_str,24,12))
  5069.     DO WHILE RIGHT(m.new_str,1)=='0'
  5070.       m.new_str=LEFT(m.new_str,LEN(m.new_str)-1)
  5071.       IF RIGHT(m.new_str,1)=='.'
  5072.         m.new_str=LEFT(m.new_str,LEN(m.new_str)-1)
  5073.         EXIT
  5074.       ENDIF
  5075.     ENDDO
  5076.   CASE m.var_type=='D'
  5077.     m.new_str=DTOC(m.eval_str)
  5078.   CASE m.var_type=='L'
  5079.     m.new_str=IIF(m.eval_str,'.T.','.F.')
  5080.   OTHERWISE
  5081.     m.new_str=m.old_str
  5082. ENDCASE
  5083. RETURN m.new_str
  5084.  
  5085. * END evlmsg
  5086.  
  5087.  
  5088.  
  5089. FUNCTION strexpr
  5090. PARAMETERS eval_str
  5091. PRIVATE new_text,var_type
  5092.  
  5093. IF PARAMETERS()=0
  5094.   RETURN ''
  5095. ENDIF
  5096. m.var_type=TYPE('m.eval_str')
  5097. DO CASE
  5098.   CASE m.var_type=='C'
  5099.     m.new_str=m.eval_str
  5100.   CASE m.var_type=='N'
  5101.     m.new_str=ALLTRIM(STR(m.eval_str,24,12))
  5102.     DO WHILE RIGHT(m.new_str,1)=='0'
  5103.       m.new_str=LEFT(m.new_str,LEN(m.new_str)-1)
  5104.       IF RIGHT(m.new_str,1)=='.'
  5105.         m.new_str=LEFT(m.new_str,LEN(m.new_str)-1)
  5106.         EXIT
  5107.       ENDIF
  5108.     ENDDO
  5109.   CASE m.var_type=='D'
  5110.     m.new_str=DTOC(m.eval_str)
  5111.   CASE m.var_type=='L'
  5112.     m.new_str=IIF(m.eval_str,'.T.','.F.')
  5113. ENDCASE
  5114. RETURN m.new_str
  5115.  
  5116. * END strexpr
  5117.  
  5118.  
  5119.  
  5120. FUNCTION evlrec
  5121. PRIVATE evlflag,evlloop,i,field_name,field_type,field_eval
  5122.  
  5123. IF TYPE('m.ignrbraces')=='L'.AND.m.ignrbraces
  5124.   RETURN .F.
  5125. ENDIF
  5126. m.evlflag=.F.
  5127. m.evlloop=.T.
  5128. DO WHILE m.evlloop
  5129.   m.evlloop=.F.
  5130.   FOR m.i = 1 TO FCOUNT()
  5131.     m.field_name=FIELD(m.i)
  5132.     m.field_type=TYPE(m.field_name)
  5133.     IF m.field_type#'M'
  5134.       LOOP
  5135.     ENDIF
  5136.     m.field_eval=EVALUATE(m.field_name)
  5137.     IF '{{'$m.field_eval
  5138.       REPLACE (m.field_name) WITH evltxt(m.field_eval)
  5139.       m.evlflag=.T.
  5140.       m.evlloop=.T.
  5141.     ENDIF
  5142.   ENDFOR
  5143.   EXIT
  5144. ENDDO
  5145. RETURN m.evlflag
  5146.  
  5147. * END evlrec
  5148.  
  5149.  
  5150.  
  5151. FUNCTION insblank
  5152. PARAMETERS skiprec
  5153. PRIVATE lastfilter,r
  5154.  
  5155. m.lastfilter=FILTER()
  5156. IF TYPE('PLATFORM')=='C'
  5157.   SET FILTER TO PLATFORM==m.platform_
  5158. ELSE
  5159.   SET FILTER TO
  5160. ENDIF
  5161. IF RECNO()<m.r_scxdata
  5162.   m.r=RECNO()
  5163.   LOCATE FOR OBJTYPE#1.AND..NOT.EMPTY(PLATFORM)
  5164.   m.r_scxdata=IIF(EOF(),m.r_scxdata,RECNO())
  5165.   IF EOF()
  5166.     GOTO m.r
  5167.     IF EMPTY(m.lastfilter)
  5168.       SET FILTER TO
  5169.     ELSE
  5170.       SET FILTER TO &lastfilter
  5171.     ENDIF
  5172.     RETURN .F.
  5173.   ENDIF
  5174. ENDIF
  5175. IF TYPE('m.skiprec')#'N'
  5176.   m.skiprec=0
  5177. ENDIF
  5178. SKIP m.skiprec
  5179. IF m.skiprec>0.OR.EOF()
  5180.   SKIP -1
  5181. ENDIF
  5182. SET FILTER TO
  5183. INSERT BLANK
  5184. IF TYPE('PLATFORM')=='C'
  5185.   REPLACE PLATFORM WITH m.platform_
  5186. ENDIF
  5187. m.r=RECNO()
  5188. SCAN REST
  5189.   IF VPOS<0
  5190.     REPLACE HPOS WITH HPOS+1
  5191.   ENDIF
  5192.   IF HEIGHT<0.OR.HEIGHT>=256
  5193.     REPLACE WIDTH WITH WIDTH+1
  5194.   ENDIF
  5195. ENDSCAN
  5196. IF TYPE('PLATFORM')=='C'
  5197.   SET FILTER TO PLATFORM==m.platform_
  5198.   LOCATE FOR OBJTYPE#1.AND..NOT.EMPTY(PLATFORM)
  5199. ELSE
  5200.   SET FILTER TO
  5201.   LOCATE FOR OBJTYPE#1
  5202. ENDIF
  5203. m.r_scxdata=IIF(EOF(),m.r_scxdata,RECNO())
  5204. GOTO m.r
  5205. IF EMPTY(m.lastfilter)
  5206.   SET FILTER TO
  5207. ELSE
  5208.   SET FILTER TO &lastfilter
  5209. ENDIF
  5210. RETURN .T.
  5211.  
  5212. * END insblank
  5213.  
  5214.  
  5215.  
  5216. FUNCTION insrec
  5217. PARAMETERS skiprec
  5218.  
  5219. IF TYPE('m.skiprec')#'N'
  5220.   m.skiprec=0
  5221. ENDIF
  5222. IF .NOT.insblank(m.skiprec)
  5223.   RETURN .F.
  5224. ENDIF
  5225. REPLACE OBJTYPE WITH 15, OBJCODE WITH 0, EXPR WITH '',;
  5226.         VPOS WITH 0, HPOS WITH 0,;
  5227.         HEIGHT WITH 0, WIDTH WITH 0, PICTURE WITH '',;
  5228.         BOXCHAR WITH '', FILLCHAR WITH '', SCHEME WITH 0,;
  5229.         SCHEME2 WITH -1, COLORPAIR WITH ''
  5230. IF TYPE('PLATFORM')=='C'
  5231.   REPLACE PLATFORM WITH m.platform_,;
  5232.           PENRED WITH -1, PENGREEN WITH -1, PENBLUE WITH -1,;
  5233.           FILLRED WITH -1, FILLGREEN WITH -1, FILLBLUE WITH -1,;
  5234.           PENSIZE WITH -1, PENPAT WITH -1, FONTFACE WITH '',;
  5235.           FONTSTYLE WITH 0, FONTSIZE WITH 0
  5236. ENDIF
  5237. RETURN .T.
  5238.  
  5239. * END insrec
  5240.  
  5241.  
  5242.  
  5243. FUNCTION duprec
  5244. PARAMETERS skiprec
  5245.  
  5246. IF RECNO()<m.r_scxdata
  5247.   RETURN .F.
  5248. ENDIF
  5249. IF TYPE('m.skiprec')#'N'
  5250.   m.skiprec=0
  5251. ENDIF
  5252. RELEASE a_fscatter
  5253. SCATTER TO a_fscatter MEMO
  5254. IF .NOT.insblank(m.skiprec)
  5255.   RELEASE a_fscatter
  5256.   RETURN .F.
  5257. ENDIF
  5258. GATHER FROM a_fscatter MEMO
  5259. RELEASE a_fscatter
  5260. RETURN .T.
  5261.  
  5262. * END duprec
  5263.  
  5264.  
  5265.  
  5266. FUNCTION insobj
  5267. PARAMETERS match_str,deldirect
  5268. PRIVATE objlib,objname,row,col,rows,cols
  5269. PRIVATE row_offset,col_offset,lastexac,old_text,new_text
  5270. PRIVATE memline,at_pos,at_line,trntxt_str,i,j
  5271.  
  5272. IF m.deldirect
  5273.   DELETE
  5274. ELSE
  5275.   REPLACE COMMENT WITH COMMENT+m.cr_lf+m.c_delete
  5276. ENDIF
  5277. m.objlib=''
  5278. m.objname=PADR(ALLTRIM(m.match_str),LEN(FOXSCX.OBJLIB_)+LEN(FOXSCX.OBJNAME_))
  5279. m.at_pos=AT('.',m.objname)
  5280. IF m.at_pos>0
  5281.   m.objlib=PADR(UPPER(CHRTRAN(ALLTRIM(LEFT(m.objname,m.at_pos-1)),;
  5282.            m.badchars,m.stdascii)),LEN(FOXSCX.OBJLIB_))
  5283.   m.objname=ALLTRIM(SUBSTR(m.objname,m.at_pos+1))
  5284. ENDIF
  5285. m.objlib=PADR(ALLTRIM(m.objlib),LEN(FOXSCX.OBJLIB_))
  5286. m.objname=PADR(ALLTRIM(m.objname),LEN(FOXSCX.OBJNAME_))
  5287. IF TYPE('m.inclibs')#'N'
  5288.   m.inclibs=0
  5289. ENDIF
  5290. IF m.inclibs=0.AND.EMPTY(m.objlib)
  5291.   =warning(m.c_insobj,m.match_str)
  5292.   RETURN .F.
  5293. ENDIF
  5294. m.objname=PADR(CHRTRAN(m.objname,m.badchars,m.stdascii),;
  5295.            LEN(FOXSCX.OBJNAME_))
  5296. m.row=VPOS
  5297. m.col=HPOS
  5298. m.rows=HEIGHT
  5299. m.cols=WIDTH
  5300. m.trntxt_str=''
  5301. m.at_line=ATCLINE(m.c_trntxt,COMMENT)
  5302. IF m.at_line>0
  5303.   FOR m.i = m.at_line TO MEMLINES(COMMENT)
  5304.     m.memline=ALLTRIM(MLINE(COMMENT,m.i))
  5305.     IF m.i>m.at_line.AND..NOT.'*:'$m.memline
  5306.       m.at_pos=AT(m.cr,COMMENT,m.i)+1
  5307.       IF m.at_pos=1.OR.ATC(m.c_trntxt,SUBSTR(COMMENT,m.at_pos))=0
  5308.         EXIT
  5309.       ENDIF
  5310.       LOOP
  5311.     ENDIF
  5312.     m.at_pos=ATC(m.c_trntxt,m.memline)
  5313.     IF m.at_pos=1
  5314.       m.trntxt_str=m.trntxt_str+m.memline+m.cr_lf
  5315.     ENDIF
  5316.   ENDFOR
  5317. ENDIF
  5318. SELECT FOXSCX
  5319. m.lstorder=ORDER()
  5320. SET ORDER TO OBJNAME_
  5321. IF EMPTY(m.objlib)
  5322.   m.lstexac=SET('EXACT')
  5323.   SET EXACT ON
  5324.   FOR m.i = 1 TO m.inclibs
  5325.     SEEK UPPER(PADR(m.objname,LEN(OBJNAME_))+PADR(a_inclib(m.i),LEN(OBJLIB_)))
  5326.     IF .NOT.EOF()
  5327.       m.objlib=OBJLIB_
  5328.       EXIT
  5329.     ENDIF
  5330.   ENDFOR
  5331.   IF m.lstexac=='ON'
  5332.     SET EXACT ON
  5333.   ELSE
  5334.     SET EXACT OFF
  5335.   ENDIF
  5336. ENDIF
  5337. m.lastorder=ORDER()
  5338. SEEK UPPER(m.objname+m.objlib)
  5339. IF EOF()
  5340.   =warning(m.c_insobj,m.match_str)
  5341.   SET ORDER TO (m.lastorder)
  5342.   SELECT SCXDATA
  5343.   RETURN .F.
  5344. ENDIF
  5345. IF .NOT.EOF().AND.OBJTYPE#1.AND.OBJTYPE#2.AND.OBJTYPE#10.AND.OBJTYPE#23
  5346.   m.row_offset=ROW-VPOS
  5347.   m.col_offset=COL-HPOS
  5348.   RELEASE a_fields
  5349.   DIMENSION a_fields(1)
  5350.   =AFIELDS(a_fields)
  5351.   SCATTER TO a_fscatter MEMO
  5352.   SELECT SCXDATA
  5353.   =insblank()
  5354.   IF ALEN(a_fscatter)=(FCOUNT()-m.fcountadj)
  5355.     GATHER FROM a_fscatter MEMO
  5356.   ELSE
  5357.     m.lastexac=SET('EXACT')
  5358.     SET EXACT ON
  5359.     FOR m.i = 1 TO (FCOUNT()-m.fcountadj)
  5360.       m.j=ASCAN(a_fields,FIELD(m.i))
  5361.       IF m.j=0
  5362.         LOOP
  5363.       ENDIF
  5364.       REPLACE (FIELD(m.i)) WITH a_fscatter(INT(m.j/4)+1)
  5365.     ENDFOR
  5366.     IF m.lastexac=='ON'
  5367.       SET EXACT ON
  5368.     ELSE
  5369.       SET EXACT OFF
  5370.     ENDIF
  5371.   ENDIF
  5372.   REPLACE VPOS WITH VPOS+m.row_offset, HPOS WITH HPOS+m.col_offset,;
  5373.                     ACTIVTYPE WITH 2
  5374.   IF TYPE('PLATFORM')=='C'
  5375.     REPLACE PLATFORM WITH m.platform_
  5376.   ENDIF
  5377.   IF ATC(m.c_basobj,COMMENT)=0
  5378.     =basobj2('')
  5379.   ENDIF
  5380.   IF TYPE('m.memvarmode')=='L'.AND.m.memvarmode
  5381.     m.old_text=ALLTRIM(MLINE(NAME,1))
  5382.     m.at_pos=AT('.',m.old_text)
  5383.     m.new_text='m'+SUBSTR(m.old_text,m.at_pos)
  5384.     IF m.at_pos>0.AND.(m.at_pos#2.OR.;
  5385.        .NOT.UPPER(LEFT(m.old_text,2))=='M.').AND.;
  5386.        .NOT.m.old_text==m.new_text
  5387.       REPLACE NAME WITH m.new_text,;
  5388.               WHEN WITH strtranc(WHEN,m.old_text,m.new_text),;
  5389.               VALID WITH strtranc(VALID,m.old_text,m.new_text),;
  5390.               MESSAGE WITH strtranc(MESSAGE,m.old_text,m.new_text),;
  5391.               ERROR WITH strtranc(ERROR,m.old_text,m.new_text),;
  5392.               RANGELO WITH strtranc(RANGELO,m.old_text,m.new_text),;
  5393.               RANGEHI WITH strtranc(RANGEHI,m.old_text,m.new_text)
  5394.     ENDIF
  5395.   ENDIF
  5396.   IF .NOT.EMPTY(m.trntxt_str)
  5397.     REPLACE COMMENT WITH m.trntxt_str+COMMENT
  5398.   ENDIF
  5399.   RELEASE a_fscatter
  5400.   =evlrec()
  5401.   SKIP -1
  5402. ELSE
  5403.   =warning(m.c_insobj,m.match_str)
  5404. ENDIF
  5405. SELECT FOXSCX
  5406. SET ORDER TO (m.lastorder)
  5407. LOCATE
  5408. SELECT SCXDATA
  5409. RETURN .T.
  5410.  
  5411. * END insobj
  5412.  
  5413.  
  5414.  
  5415. FUNCTION insscx
  5416. PARAMETERS scxname,deldirect
  5417. PRIVATE row,col,rows,cols,row_offset,col_offset,lastexac,old_text,new_text
  5418. PRIVATE memline,at_pos,at_line,trntxt_str,inscount,i,j,r
  5419.  
  5420. m.inscount=0
  5421. IF m.deldirect
  5422.   DELETE
  5423. ELSE
  5424.   REPLACE COMMENT WITH COMMENT+m.cr_lf+m.c_delete
  5425. ENDIF
  5426. IF .NOT.'.'$m.scxname
  5427.   m.scxname=m.scxname+'.SCX'
  5428. ENDIF
  5429. IF .NOT.FILE(m.scxname)
  5430.   =warning(m.c_insscx,m.scxname)
  5431.   RETURN m.inscount
  5432. ENDIF
  5433. m.r=RECNO()
  5434. m.row=VPOS
  5435. m.col=HPOS
  5436. m.rows=INT(objheight()-1)
  5437. m.cols=INT(objwidth()-1)
  5438. m.trntxt_str=''
  5439. m.at_line=ATCLINE(m.c_trntxt,COMMENT)
  5440. IF m.at_line>0
  5441.   FOR m.i = m.at_line TO MEMLINES(COMMENT)
  5442.     m.memline=ALLTRIM(MLINE(COMMENT,m.i))
  5443.     IF m.i>m.at_line.AND..NOT.'*:'$m.memline
  5444.       m.at_pos=AT(m.cr,COMMENT,m.i)+1
  5445.       IF m.at_pos=1.OR.ATC(m.c_trntxt,SUBSTR(COMMENT,m.at_pos))=0
  5446.         EXIT
  5447.       ENDIF
  5448.       LOOP
  5449.     ENDIF
  5450.     m.at_pos=ATC(m.c_trntxt,m.memline)
  5451.     IF m.at_pos=1
  5452.       m.trntxt_str=m.trntxt_str+m.memline+m.cr_lf
  5453.     ENDIF
  5454.   ENDFOR
  5455. ENDIF
  5456. IF USED('SCXINSERT')
  5457.   SELECT SCXINSERT
  5458.   USE
  5459. ELSE
  5460.   SELECT 0
  5461. ENDIF
  5462. USE (m.scxname) ALIAS SCXINSERT
  5463. IF TYPE('PLATFORM')=='C'
  5464.   SET FILTER TO PLATFORM==m.platform_
  5465. ELSE
  5466.   SET FILTER TO
  5467. ENDIF
  5468. LOCATE
  5469. m.row_offset=m.row-VPOS
  5470. m.col_offset=m.col-HPOS
  5471. SCAN ALL FOR OBJTYPE#1.AND.OBJTYPE#2.AND.OBJTYPE#10.AND.OBJTYPE#23.AND.;
  5472.              INT(VPOS)<=m.rows.AND.INT(HPOS)<=m.cols
  5473.   RELEASE a_fields
  5474.   DIMENSION a_fields(1)
  5475.   =AFIELDS(a_fields)
  5476.   SCATTER TO a_fscatter MEMO
  5477.   SELECT SCXDATA
  5478.   IF .NOT.insblank()
  5479.     EXIT
  5480.   ENDIF
  5481.   m.inscount=m.inscount+1
  5482.   IF ALEN(a_fscatter)=FCOUNT()
  5483.     GATHER FROM a_fscatter MEMO
  5484.   ELSE
  5485.     m.lastexac=SET('EXACT')
  5486.     SET EXACT ON
  5487.     FOR m.i = 1 TO FCOUNT()
  5488.       m.j=ASCAN(a_fields,FIELD(m.i))
  5489.       IF m.j=0
  5490.         LOOP
  5491.       ENDIF
  5492.       REPLACE (FIELD(m.i)) WITH a_fscatter(INT(m.j/4)+1)
  5493.     ENDFOR
  5494.     IF m.lastexac=='ON'
  5495.       SET EXACT ON
  5496.     ELSE
  5497.       SET EXACT OFF
  5498.     ENDIF
  5499.   ENDIF
  5500.   RELEASE a_fields
  5501.   REPLACE VPOS WITH VPOS+m.row_offset, HPOS WITH HPOS+m.col_offset,;
  5502.           ACTIVTYPE WITH 2
  5503.   IF TYPE('PLATFORM')=='C'
  5504.     REPLACE PLATFORM WITH m.platform_
  5505.   ENDIF
  5506.   IF TYPE('m.memvarmode')=='L'.AND.m.memvarmode
  5507.     m.old_text=ALLTRIM(MLINE(NAME,1))
  5508.     m.at_pos=AT('.',m.old_text)
  5509.     m.new_text='m'+SUBSTR(m.old_text,m.at_pos)
  5510.     IF m.at_pos>0.AND.(m.at_pos#2.OR.;
  5511.        .NOT.UPPER(LEFT(m.old_text,2))=='M.').AND.;
  5512.        .NOT.m.old_text==m.new_text
  5513.       REPLACE NAME WITH 'm'+SUBSTR(NAME,m.at_pos)
  5514.       m.new_text=ALLTRIM(MLINE(NAME,1))
  5515.       REPLACE WHEN WITH strtranc(WHEN,m.old_text,m.new_text),;
  5516.               VALID WITH strtranc(VALID,m.old_text,m.new_text),;
  5517.               MESSAGE WITH strtranc(MESSAGE,m.old_text,m.new_text),;
  5518.               ERROR WITH strtranc(ERROR,m.old_text,m.new_text),;
  5519.               RANGELO WITH strtranc(RANGELO,m.old_text,m.new_text),;
  5520.               RANGEHI WITH strtranc(RANGEHI,m.old_text,m.new_text)
  5521.     ENDIF
  5522.   ENDIF
  5523.   IF .NOT.EMPTY(m.trntxt_str)
  5524.     REPLACE COMMENT WITH m.trntxt_str+COMMENT
  5525.   ENDIF
  5526.   =evlrec()
  5527.   SELECT SCXINSERT
  5528. ENDSCAN
  5529. RELEASE a_fscatter
  5530. USE IN SCXINSERT
  5531. SELECT SCXDATA
  5532. GOTO m.r
  5533. RETURN m.inscount
  5534.  
  5535. * END insscx
  5536.  
  5537.  
  5538.  
  5539. FUNCTION defobj1
  5540. PARAMETERS objname
  5541.  
  5542. RETURN defobj2(m.objname)
  5543.  
  5544. * END defobj1
  5545.  
  5546.  
  5547.  
  5548. FUNCTION defobj2
  5549. PARAMETERS objname
  5550.  
  5551. REPLACE COMMENT WITH m.c_defobj+' '+m.objname+m.cr_lf+COMMENT
  5552. RETURN .T.
  5553.  
  5554. * END defobj2
  5555.  
  5556.  
  5557.  
  5558. FUNCTION basobj1
  5559. PARAMETERS objname
  5560.  
  5561. RETURN defobj2(m.objname)
  5562.  
  5563. * END basobj1
  5564.  
  5565.  
  5566.  
  5567. FUNCTION basobj2
  5568. PARAMETERS objname
  5569.  
  5570. REPLACE COMMENT WITH COMMENT+m.cr_lf+m.c_basobj+' '+m.objname
  5571.  
  5572. * END basobj2
  5573.  
  5574.  
  5575.  
  5576. FUNCTION delobj1
  5577.  
  5578. RETURN delobj2()
  5579.  
  5580. * END delobj1
  5581.  
  5582.  
  5583.  
  5584. FUNCTION delobj2
  5585.  
  5586. REPLACE COMMENT WITH m.c_delobj+m.cr_lf+COMMENT
  5587. RETURN .T.
  5588.  
  5589. * END delobj2
  5590.  
  5591.  
  5592.  
  5593. FUNCTION delete1
  5594.  
  5595. RETURN delete2()
  5596.  
  5597. * END delete1
  5598.  
  5599.  
  5600.  
  5601. FUNCTION delete2
  5602.  
  5603. REPLACE COMMENT WITH m.c_delete+m.cr_lf+COMMENT
  5604. RETURN .T.
  5605.  
  5606. * END delete2
  5607.  
  5608.  
  5609.  
  5610. FUNCTION insobj1
  5611. PARAMETERS textstr
  5612.  
  5613. RETURN insobj2(m.textstr)
  5614.  
  5615. * END insobj1
  5616.  
  5617.  
  5618.  
  5619. FUNCTION insobj2
  5620. PARAMETERS textstr
  5621.  
  5622. REPLACE COMMENT WITH m.c_insobj+' '+m.textstr+m.cr_lf+COMMENT
  5623. RETURN .T.
  5624.  
  5625. * END insobj2
  5626.  
  5627.  
  5628.  
  5629. FUNCTION insscx1
  5630. PARAMETERS textstr
  5631.  
  5632. RETURN insscx2(m.textstr)
  5633.  
  5634. * END insscx1
  5635.  
  5636.  
  5637.  
  5638. FUNCTION insscx2
  5639. PARAMETERS textstr
  5640.  
  5641. REPLACE COMMENT WITH m.c_insscx+' '+m.textstr+m.cr_lf+COMMENT
  5642. RETURN .T.
  5643.  
  5644. * END insscx2
  5645.  
  5646.  
  5647.  
  5648. FUNCTION instxt1
  5649. PARAMETERS textstr,skiprec
  5650. PRIVATE r
  5651.  
  5652. RETURN instxt2(m.textstr,m.skiprec)
  5653.  
  5654. * END instxt1
  5655.  
  5656.  
  5657.  
  5658. FUNCTION instxt2
  5659. PARAMETERS textstr,skiprec
  5660. PRIVATE r
  5661.  
  5662. IF RECNO()<m.r_scxdata
  5663.   RETURN .F.
  5664. ENDIF
  5665. m.r=RECNO()
  5666. IF TYPE('m.skiprec')#'N'
  5667.   m.skiprec=0
  5668. ENDIF
  5669. IF m.skiprec#0
  5670.   IF .NOT.insrec(m.skiprec)
  5671.     RETURN .F.
  5672.   ENDIF
  5673. ENDIF
  5674. REPLACE COMMENT WITH COMMENT+m.cr+m.c_instxt+m.cr+m.textstr
  5675. GOTO m.r
  5676. IF m.skiprec<0
  5677.   SKIP
  5678. ENDIF
  5679. RETURN .T.
  5680.  
  5681. * END instxt2
  5682.  
  5683.  
  5684.  
  5685. FUNCTION clrtxt1
  5686.  
  5687. RETURN clrtxt2()
  5688.  
  5689. * END clrtxt1
  5690.  
  5691.  
  5692.  
  5693. FUNCTION clrtxt2
  5694.  
  5695. IF RECNO()<m.r_scxdata
  5696.   RETURN .F.
  5697. ENDIF
  5698. REPLACE COMMENT WITH ''
  5699. RETURN .T.
  5700.  
  5701. * END clrtxt2
  5702.  
  5703.  
  5704.  
  5705. FUNCTION insif1
  5706. PARAMETERS textstr
  5707.  
  5708. RETURN insif2(m.textstr)
  5709.  
  5710. * END insif1
  5711.  
  5712.  
  5713.  
  5714. FUNCTION insif2
  5715. PARAMETERS textstr
  5716. PRIVATE sayrefresh
  5717.  
  5718. m.sayrefresh=REFRESH
  5719. IF .NOT.instxt2('IF '+m.textstr,-1)
  5720.   RETURN .F.
  5721. ENDIF
  5722. IF instxt2('ENDIF',1)
  5723.   SKIP -1
  5724.   REPLACE NEXT 3 REFRESH WITH m.sayrefresh
  5725.   SKIP -1
  5726.   RETURN .T.
  5727. ENDIF
  5728. RETURN .F.
  5729.  
  5730. * END insif2
  5731.  
  5732.  
  5733.  
  5734. FUNCTION size1
  5735. PARAMETERS textstr
  5736.  
  5737. RETURN size2(m.textstr)
  5738.  
  5739. * END size1
  5740.  
  5741.  
  5742.  
  5743. FUNCTION size2
  5744. PARAMETERS textstr
  5745.  
  5746. IF TYPE('m.textstr')#'C'.OR.EMPTY(m.textstr)
  5747.   REPLACE COMMENT WITH m.c_nosize+m.cr_lf+COMMENT
  5748. ELSE
  5749.   REPLACE COMMENT WITH m.c_size+' '+m.textstr+m.cr_lf+COMMENT
  5750. ENDIF
  5751. RETURN .T.
  5752.  
  5753. * END size2
  5754.  
  5755.  
  5756.  
  5757. FUNCTION default1
  5758. PARAMETERS textstr
  5759.  
  5760. RETURN default2(m.textstr)
  5761.  
  5762. * END default1
  5763.  
  5764.  
  5765.  
  5766. FUNCTION default2
  5767. PARAMETERS textstr
  5768.  
  5769. REPLACE COMMENT WITH m.c_default+' '+m.textstr+m.cr_lf+COMMENT
  5770. RETURN .T.
  5771.  
  5772. * END default2
  5773.  
  5774.  
  5775.  
  5776. FUNCTION function1
  5777. PARAMETERS textstr
  5778.  
  5779. RETURN function2(m.textstr)
  5780.  
  5781. * END function1
  5782.  
  5783.  
  5784.  
  5785. FUNCTION function2
  5786. PARAMETERS textstr
  5787.  
  5788. REPLACE COMMENT WITH m.c_function+' '+m.textstr+m.cr_lf+COMMENT
  5789. RETURN .T.
  5790.  
  5791. * END function2
  5792.  
  5793.  
  5794.  
  5795.  
  5796. FUNCTION insfnct
  5797. PARAMETERS textstr
  5798.  
  5799. GOTO m.r_scxdata
  5800. IF .NOT.insrec(-1)
  5801.   RETURN .F.
  5802. ENDIF
  5803. IF .NOT.function2(m.textstr)
  5804.   RETURN .F.
  5805. ENDIF
  5806. IF .NOT.delobj2()
  5807.   RETURN .F.
  5808. ENDIF
  5809. RETURN .T.
  5810.  
  5811. * END insfnct
  5812.  
  5813.  
  5814.  
  5815. FUNCTION click1
  5816. PARAMETERS textstr
  5817.  
  5818. RETURN click2(m.textstr)
  5819.  
  5820. * END click1
  5821.  
  5822.  
  5823.  
  5824. FUNCTION click2
  5825. PARAMETERS textstr
  5826.  
  5827. REPLACE COMMENT WITH m.c_click+' '+m.textstr+m.cr_lf+COMMENT
  5828. RETURN .T.
  5829.  
  5830. * END click2
  5831.  
  5832.  
  5833.  
  5834. FUNCTION delrec
  5835.  
  5836. DELETE
  5837. RETURN .T.
  5838.  
  5839. * END delrec
  5840.  
  5841.  
  5842.  
  5843. FUNCTION drvobj
  5844.  
  5845. DO CASE
  5846.   CASE RECNO()<m.r_scxdata
  5847.     RETURN .F.
  5848.   CASE DELETED()
  5849.     RETURN .F.
  5850. ENDCASE
  5851. RETURN .T.
  5852.  
  5853. * drvobj
  5854.  
  5855.  
  5856.  
  5857. FUNCTION drvenable
  5858. PARAMETERS prog_name
  5859. PRIVATE var_name
  5860.  
  5861. m.var_name='_'+UPPER(m.prog_name)
  5862. IF IIF(TYPE('EVALUATE(m.var_name)')=='C',EVALUATE(m.var_name),;
  5863.    configfp(m.prog_name,'ON'))=='OFF'
  5864.   RETURN .F.
  5865. ENDIF
  5866. RETURN .T.
  5867.  
  5868. * drvenable
  5869.  
  5870.  
  5871.  
  5872. FUNCTION objsay
  5873.  
  5874. RETURN '@ '+objpos()+' SAY '+EXPR
  5875.  
  5876. * END objsay
  5877.  
  5878.  
  5879.  
  5880. FUNCTION objpos
  5881.  
  5882. IF INLIST(ALLTRIM(m.platform_),'WINDOWS','MAC')
  5883.   RETURN ALLTRIM(STR(VPOS,7,3))+','+ALLTRIM(STR(HPOS,7,3))
  5884. ENDIF
  5885. RETURN ALLTRIM(STR(VPOS,3))+','+ALLTRIM(STR(HPOS,3))
  5886.  
  5887. * END objpos
  5888.  
  5889.  
  5890.  
  5891. FUNCTION objdata
  5892. PARAMETERS match_str,eval_str
  5893. PRIVATE new_str,mthd_str,at_pos,r
  5894.  
  5895. m.new_str=''
  5896. IF '.'$m.match_str.OR..NOT.USED('SCXDATA')
  5897.   RETURN libdata(m.match_str,m.eval_str)
  5898. ENDIF
  5899. m.match_str=PADR(CHRTRAN(ALLTRIM(m.match_str),m.badchars,m.stdascii),24)
  5900. m.r=RECNO()
  5901. GOTO m.r_scxdata
  5902. LOCATE REST FOR PADR(UPPER(CHRTRAN(wordsearch(m.c_defobj),;
  5903.                 m.badchars,m.stdascii)),24)==UPPER(m.match_str)
  5904. IF EOF()
  5905.   IF TYPE('m.evlmode')=='L'.AND.m.evlmode
  5906.     m.new_str=libdata(m.match_str,m.eval_str)
  5907.   ELSE
  5908.     =warning('objdata()',m.match_str)
  5909.   ENDIF
  5910. ELSE
  5911.   IF TYPE('m.eval_str')#'C'.OR.EMPTY(m.eval_str).OR.;
  5912.      UPPER(m.eval_str)=='COMMENT'
  5913.     m.eval_str=m.eval_cmnt
  5914.   ENDIF
  5915.   IF '::'$m.eval_str
  5916.     m.at_pos=AT('::',m.eval_str)
  5917.     m.mthd_str=SUBSTR(m.eval_str,m.at_pos+2)
  5918.     m.eval_str=LEFT(m.eval_str,m.at_pos-1)
  5919.     IF EMPTY(m.eval_str)
  5920.       m.eval_str=m.eval_cmnt
  5921.     ENDIF
  5922.     m.new_str=evlstr(m.eval_str)
  5923.     m.at_pos=ATC(m.c_method+' '+m.mthd_str+m.cr,m.new_str+m.cr)
  5924.     IF m.at_pos=0
  5925.       =warning('objdata()',m.match_str+'::'+m.eval_str+'::'+m.mthd_str)
  5926.       m.new_str=''
  5927.     ELSE
  5928.       m.new_str=SUBSTR(m.new_str,m.at_pos)
  5929.       m.at_pos=ATC(m.c_endmthd,m.new_str)
  5930.       IF m.at_pos>0
  5931.         m.new_str=LEFT(m.new_str,m.at_pos+LEN(m.c_endmthd)-1)
  5932.       ENDIF
  5933.       m.new_str=m.new_str+m.cr_lf
  5934.     ENDIF
  5935.   ELSE
  5936.     m.new_str=evlstr(m.eval_str)
  5937.   ENDIF
  5938. ENDIF
  5939. GOTO m.r
  5940. RETURN m.new_str
  5941.  
  5942. * END objdata
  5943.  
  5944.  
  5945.  
  5946. FUNCTION libdata
  5947. PARAMETERS match_str,eval_str
  5948. PRIVATE new_str,mthd_str,at_pos,i,objlib,objname,lstselect,lstorder,lstexac
  5949.  
  5950. m.new_str=''
  5951. m.lstselect=SELECT()
  5952. IF .NOT.openfoxscx()
  5953.   RETURN m.new_str
  5954. ENDIF
  5955. m.objlib=''
  5956. m.objname=PADR(ALLTRIM(m.match_str),LEN(FOXSCX.OBJLIB_)+LEN(FOXSCX.OBJNAME_))
  5957. m.at_pos=AT('.',m.objname)
  5958. IF m.at_pos>0
  5959.   m.objlib=PADR(UPPER(CHRTRAN(ALLTRIM(LEFT(m.objname,m.at_pos-1)),;
  5960.            m.badchars,m.stdascii)),LEN(FOXSCX.OBJLIB_))
  5961.   m.objname=ALLTRIM(SUBSTR(m.objname,m.at_pos+1))
  5962. ENDIF
  5963. IF TYPE('m.inclibs')#'N'
  5964.   m.inclibs=0
  5965. ENDIF
  5966. IF m.inclibs=0.AND.EMPTY(m.objlib)
  5967.   =warning('libdata()',m.match_str)
  5968.   RETURN m.new_str
  5969. ENDIF
  5970. m.objname=PADR(CHRTRAN(m.objname,m.badchars,m.stdascii),;
  5971.           LEN(FOXSCX.OBJNAME_))
  5972. SELECT FOXSCX
  5973. m.lstorder=ORDER()
  5974. SET ORDER TO OBJNAME_
  5975. IF EMPTY(m.objlib)
  5976.   m.lstexac=SET('EXACT')
  5977.   SET EXACT ON
  5978.   FOR m.i = 1 TO m.inclibs
  5979.     SEEK UPPER(PADR(m.objname,LEN(OBJNAME_))+PADR(a_inclib(m.i),LEN(OBJLIB_)))
  5980.     IF .NOT.EOF()
  5981.       m.objlib=OBJLIB_
  5982.       EXIT
  5983.     ENDIF
  5984.   ENDFOR
  5985.   IF m.lstexac=='ON'
  5986.     SET EXACT ON
  5987.   ELSE
  5988.     SET EXACT OFF
  5989.   ENDIF
  5990. ENDIF
  5991. SEEK UPPER(m.objname+m.objlib)
  5992. IF EOF()
  5993.   =warning('libdata()',m.match_str)
  5994. ELSE
  5995.   IF TYPE('m.eval_str')#'C'.OR.EMPTY(m.eval_str).OR.;
  5996.      UPPER(m.eval_str)=='COMMENT'
  5997.     m.eval_str=m.eval_cmnt
  5998.   ENDIF
  5999.   IF '::'$m.eval_str
  6000.     m.at_pos=AT('::',m.eval_str)
  6001.     m.mthd_str=SUBSTR(m.eval_str,m.at_pos+2)
  6002.     m.eval_str=LEFT(m.eval_str,m.at_pos-1)
  6003.     IF EMPTY(m.eval_str)
  6004.       m.eval_str=m.eval_cmnt
  6005.     ENDIF
  6006.     m.new_str=evlstr(m.eval_str)
  6007.     m.at_pos=ATC(m.c_method+' '+m.mthd_str+m.cr,m.new_str+m.cr)
  6008.     IF m.at_pos=0
  6009.       =warning('libdata()',m.match_str+'::'+m.eval_str+'::'+m.mthd_str)
  6010.       m.new_str=''
  6011.     ELSE
  6012.       m.new_str=SUBSTR(m.new_str,m.at_pos)
  6013.       m.at_pos=ATC(m.c_endmthd,m.new_str)
  6014.       IF m.at_pos>0
  6015.         m.new_str=LEFT(m.new_str,m.at_pos+LEN(m.c_endmthd)-1)+m.cr_lf
  6016.       ENDIF
  6017.     ENDIF
  6018.   ELSE
  6019.     m.new_str=evlstr(m.eval_str)
  6020.   ENDIF
  6021. ENDIF
  6022. SET ORDER TO (m.lstorder)
  6023. LOCATE
  6024. SELECT (m.lstselect)
  6025. RETURN m.new_str
  6026.  
  6027. * END libdata
  6028.  
  6029.  
  6030.  
  6031. FUNCTION insert
  6032. PARAMETERS filename
  6033. PRIVATE mlstselect
  6034.  
  6035. IF .NOT.FILE(m.filename)
  6036.   =warning('insert()',m.filename)
  6037.   RETURN ''
  6038. ENDIF
  6039. m.lstselect=SELECT()
  6040. IF USED('INSERTFILE')
  6041.   SELECT INSERTFILE
  6042.   LOCATE
  6043. ELSE
  6044.   CREATE CURSOR INSERTFILE (FILEINFO M)
  6045.   SELECT INSERTFILE
  6046.   INSERT BLANK
  6047. ENDIF
  6048. APPEND MEMO FILEINFO FROM (m.filename) OVERWRITE
  6049. SELECT (m.lstselect)
  6050. RETURN INSERTFILE.FILEINFO
  6051.  
  6052. * END insert
  6053.  
  6054.  
  6055.  
  6056. FUNCTION objheight
  6057. PRIVATE height2,picture2
  6058.  
  6059. m.height2=HEIGHT
  6060. IF (OBJTYPE=12.OR.OBJTYPE=13).AND.';'$PICTURE
  6061.   m.picture2=UPPER(ALLTRIM(SUBSTR(MLINE(PICTURE,1),2,5)))
  6062.   IF (OBJTYPE=12.AND.m.picture2=='@*VN').OR.;
  6063.      (OBJTYPE=13.AND.m.picture2=='@*RVN')
  6064.     m.height2=m.height2+(m.height2+SPACING)*OCCURS(';',PICTURE)
  6065.   ENDIF
  6066. ENDIF
  6067. RETURN m.height2*objfactor()
  6068.  
  6069. * END objheight
  6070.  
  6071.  
  6072.  
  6073. FUNCTION objwidth
  6074. PRIVATE width2,picture2
  6075.  
  6076. m.width2=WIDTH
  6077. IF (OBJTYPE=12.OR.OBJTYPE=13).AND.';'$PICTURE
  6078.   m.picture2=UPPER(ALLTRIM(SUBSTR(MLINE(PICTURE,1),2,5)))
  6079.   IF (OBJTYPE=12.AND.m.picture2=='@*HN').OR.;
  6080.      (OBJTYPE=13.AND.m.picture2=='@*RHN')
  6081.     m.width2=m.width2+(m.width2+SPACING)*OCCURS(';',PICTURE)
  6082.   ENDIF
  6083. ENDIF
  6084. RETURN m.width2*objfactor(.T.)
  6085.  
  6086. * END objwidth
  6087.  
  6088.  
  6089.  
  6090.  
  6091. FUNCTION objfactor
  6092. PARAMETERS widthflag
  6093. PRIVATE cfontstylm,cfontstyl,vfontratio,hfontratio
  6094.  
  6095. IF TYPE('_WINDOWS')#'L'.OR.(.NOT._WINDOWS.AND..NOT._MAC).OR.;
  6096.    TYPE('PLATFORM')#'C'.OR.EMPTY(FONTFACE).OR.;
  6097.    .NOT.INLIST(ALLTRIM(m.platform_),'WINDOWS','MAC')
  6098.   RETURN 1
  6099. ENDIF
  6100. IF TYPE('m.fontface')=='U'
  6101.   m.fontface='MS Sans Serif'
  6102.   m.fontsize=8
  6103.   m.fontstyle=0
  6104. ENDIF
  6105. m.cfontstylm=IIF(m.fontstyle=1.OR.m.fontstyle=3,'B','')
  6106. m.cfontstyl=IIF(FONTSTYLE=1.OR.FONTSTYLE=3,'B','')
  6107. m.vfontratio=FONTMETRIC(1,m.fontface,m.fontsize,m.cfontstylm)/;
  6108.              (FONTMETRIC(1,m.fontface,m.fontsize,m.cfontstylm)+;
  6109.              FONTMETRIC(5,m.fontface,m.fontsize,m.cfontstylm))*;
  6110.              (FONTMETRIC(1,WFONT(1,''),WFONT(2,''),WFONT(3,''))+;
  6111.              FONTMETRIC(5,WFONT(1,''),WFONT(2,''),WFONT(3,'')))/;
  6112.              FONTMETRIC(1,'FoxFont',9,'N')
  6113. m.hfontratio=FONTMETRIC(6,m.fontface,m.fontsize,m.cfontstylm)/;
  6114.              FONTMETRIC(6,m.fontface,m.fontsize,m.cfontstylm)*;
  6115.              FONTMETRIC(6,WFONT(1,''),WFONT(2,''),WFONT(3,''))/;
  6116.              FONTMETRIC(6,'FoxFont',9,'N')
  6117. IF m.widthflag
  6118.   RETURN FONTMETRIC(6,FONTFACE,FONTSIZE,m.cfontstyl)/;
  6119.          FONTMETRIC(6,m.fontface,m.fontsize,m.cfontstylm)/(m.hfontratio*;
  6120.          (FONTMETRIC(6,'FoxFont',9,'N')/FONTMETRIC(6,WFONT(1,''),WFONT(2,''),;
  6121.          WFONT(3,''))))
  6122. ENDIF
  6123. RETURN (FONTMETRIC(1,FONTFACE,FONTSIZE,m.cfontstyl)+;
  6124.        FONTMETRIC(5,FONTFACE,FONTSIZE,m.cfontstyl))/;
  6125.        (FONTMETRIC(1,m.fontface,m.fontsize,m.cfontstylm)+;
  6126.        FONTMETRIC(5,m.fontface,m.fontsize,m.cfontstylm))/(m.vfontratio*;
  6127.        (FONTMETRIC(1,'FoxFont',9,'N')/FONTMETRIC(1,WFONT(1,''),WFONT(2,''),;
  6128.        WFONT(3,''))))
  6129.  
  6130. * END objfactor
  6131.